2013-02-28 18 views
6

Próbuję zarchiwizować folder w VBScript i wygląda na to, że nie działa. Jestem pewien, że poprawnie tworzę plik nagłówkowy.Rozpakuj folder w górę

Tworzy rzeczywisty plik poprawnie, po prostu nie zip folder.

Ktoś ma jakieś pomysły:

Sub ArchiveFolder (folder) 

    Dim fso, wShell, sApp, zipFile 

    Set fso = CreateObject("Scripting.FileSystemObject") 
    Set wShell = CreateObject("WScript.Shell") 
    Set sApp = CreateObject("Shell.Application") 
    Set zipFile = fso.CreateTextFile(folder & ".zip") 

    ' Write zip file header. 
    zipFile.Write "PK" & Chr(5) & Chr(6) & String(18, 0) 
    zipFile.Close 

    sApp.NameSpace(folder & ".zip").CopyHere folder 

End Sub 
+0

[Sprawdź to] (http://stackoverflow.com/questions/28043589/) program zip jest napisany w JScript, ale możesz go nazwać procesem zewnętrznym lub umieścić go w pliku wsh z kodem vbscript. – npocmaka

Odpowiedz

9

Odpowiedź znalazłem here. Magia znajduje się w ostatnim Do..Loop, gdzie skrypt czeka na wykonanie zadania przez Shell.

ArchiveFolder "sub\foo.zip", "..\baz" 

Sub ArchiveFolder (zipFile, sFolder) 

    With CreateObject("Scripting.FileSystemObject") 
     zipFile = .GetAbsolutePathName(zipFile) 
     sFolder = .GetAbsolutePathName(sFolder) 

     With .CreateTextFile(zipFile, True) 
      .Write Chr(80) & Chr(75) & Chr(5) & Chr(6) & String(18, chr(0)) 
     End With 
    End With 

    With CreateObject("Shell.Application") 
     .NameSpace(zipFile).CopyHere .NameSpace(sFolder).Items 

     Do Until .NameSpace(zipFile).Items.Count = _ 
       .NameSpace(sFolder).Items.Count 
      WScript.Sleep 1000 
     Loop 
    End With 

End Sub 
+0

Powyższy kod działa poprawnie, ale po utworzeniu pliku zip nie można go skopiować. Odmowa dostępu. Ręcznie próbowałam również otworzyć plik otrzymując ten sam błąd. Proszę zasugeruj – sanjeeb

1

Sprawdź swój argument. folder musi być ścieżką do obiektu, który chcesz umieścić w pliku zip. Jeśli jest to obiekt folderu, musisz użyć folder.Path, ponieważ domyślną metodą obiektów folderów jest Name, a CopyHere nie może znaleźć obiektu z samą nazwą.

Można dodać kilka sprawozdań debugowania do swojej funkcji, aby sprawdzić, czy:

WScript.Echo TypeName(folder) 
If fso.FolderExists(folder) Then 
    WScript.Echo folder & " exists." 
Else 
    WScript.Echo folder & " doesn't exist." 
End If