2013-02-28 2 views
6

Я пытаюсь создать ZIP-файл в VBScript и, похоже, не работает. Я уверен, что правильно создаю файл заголовка.Zip a folder up

Он создает фактический файл правильно, просто не застегивает папку.

Кто есть какие-либо идеи:

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

[проверить это] (http://stackoverflow.com/questions/28043589/) zip-утилита написана на JScript, но вы можете назвать ее внешним процессом или если вы поместите ее в wsh-файл с кодом vbscript. – npocmaka

ответ

9

Ответ, который я нашел here. Магия находится в последнем Do..Loop, где сценарий ожидает 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

Выше код работает нормально, но после создания zip-файла не удается скопировать файл в него .. отказ в доступе. В ручном режиме я также попытался открыть файл, получив такую ​​же ошибку. Пожалуйста, предложите – sanjeeb

1

Проверьте аргумент. folder должен быть путь к объекту, который вы хотите поместить в zip-файл. Если это объект папки, вы должны использовать folder.Path, потому что метод по умолчанию для объектов папки - Name, а CopyHere не может найти объект с именем.

Вы можете добавить несколько отладочных вашей функции, чтобы проверить, что:

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