Я записал, что маленький VBScript к создает .zip файл и затем копирует содержание указанной папки в это .zip файл.
Я копирую файлы один за другим по причине (я знаю, что могу сделать всех сразу). Однако моя проблема состоит в том, когда я пытаюсь скопировать их один за другим без WScript. Сон между каждым повторением цикла я получаю "Файл, не найденный или никакое разрешение чтения". ошибка; если я помещаю a WScript.Sleep 200
после каждой записи это работает, но не 100% времени.
В значительной степени я хотел бы избавиться от функции Сна и не полагаться на это, потому что в зависимости от размера файла может занять больше времени записать поэтому, что 200 миллисекунд не могут быть достаточно и т.д.
Как Вы видите с маленькой частью кода ниже, я циклично выполняюсь через файлы, затем если они соответствуют расширению, я размещаю их в .zip (zipFile)
For Each file In folderToZip.Items
For Each extension In fileExtensions
if (InStr(file, extension)) Then
zipFile.CopyHere(file)
WScript.Sleep 200
Exit For
End If
Next
Next
Какие-либо предложения о том, как я могу прекратить полагаться на функцию Сна?
Спасибо
Вы можете попытаться получить доступ к только что скопированному файлу, например, с помощью проверки «существует»:
For Each file In folderToZip.Items
For Each extension In fileExtensions
If LCase(oFSo.GetExtensionName(file)) = LCase(extension) Then
zipFile.CopyHere(file)
Dim i: i = 0
Dim target: target = oFSO.BuildPath(zipFile, oFSO.GetFileName(file))
While i < 100 And Not oFSO.FileExists(target)
i = i + 1
WScript.Sleep 10
Wend
Exit For
End If
Next
Next
Я не уверен, правильно ли цель
вычислена для этого контекста использования, но вы получить идею. Я немного удивлен, что эта ошибка возникает в первую очередь ... FileSystemObject
должен быть строго синхронным.
Если ничего не помогает, сделайте следующее:
For Each file In folderToZip.Items
For Each extension In fileExtensions
If LCase(oFSo.GetExtensionName(file)) = LCase(extension) Then
CompressFailsafe zipFile, file
Exit For
End If
Next
Next
Sub CompressFailsafe(zipFile, file)
Dim i: i = 0
Const MAX = 100
On Error Resume Next
While i < MAX
zipFile.CopyHere(file)
If Err.Number = 0 Then
i = MAX
ElseIf Err.Number = xxx ''# use the actual error number!
Err.Clear
WScript.Sleep 100
i = i + 1
Else
''# react to unexpected error
End Of
Wend
On Error GoTo 0
End Sub
Вы правы, CopyHere асинхронный. Когда я делаю это в vbscript, я сплю до тех пор, пока количество файлов в zip-архиве не станет больше или равно количеству скопированных файлов.
Sub NewZip(pathToZipFile)
WScript.Echo "Newing up a zip file (" & pathToZipFile & ") "
Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
Dim file
Set file = fso.CreateTextFile(pathToZipFile)
file.Write Chr(80) & Chr(75) & Chr(5) & Chr(6) & String(18, 0)
file.Close
Set fso = Nothing
Set file = Nothing
WScript.Sleep 500
End Sub
Sub CreateZip(pathToZipFile, dirToZip)
WScript.Echo "Creating zip (" & pathToZipFile & ") from (" & dirToZip & ")"
Dim fso
Set fso= Wscript.CreateObject("Scripting.FileSystemObject")
If fso.FileExists(pathToZipFile) Then
WScript.Echo "That zip file already exists - deleting it."
fso.DeleteFile pathToZipFile
End If
If Not fso.FolderExists(dirToZip) Then
WScript.Echo "The directory to zip does not exist."
Exit Sub
End If
NewZip pathToZipFile
dim sa
set sa = CreateObject("Shell.Application")
Dim zip
Set zip = sa.NameSpace(pathToZipFile)
WScript.Echo "opening dir (" & dirToZip & ")"
Dim d
Set d = sa.NameSpace(dirToZip)
' for diagnostic purposes only
For Each s In d.items
WScript.Echo s
Next
' http://msdn.microsoft.com/en-us/library/bb787866(VS.85).aspx
' ===============================================================
' 4 = do not display a progress box
' 16 = Respond with "Yes to All" for any dialog box that is displayed.
' 128 = Perform the operation on files only if a wildcard file name (*.*) is specified.
' 256 = Display a progress dialog box but do not show the file names.
' 2048 = Version 4.71. Do not copy the security attributes of the file.
' 4096 = Only operate in the local directory. Don't operate recursively into subdirectories.
WScript.Echo "copying files..."
zip.CopyHere d.items, 4
Do Until d.Items.Count <= zip.Items.Count
Wscript.Sleep(200)
Loop
End Sub