我使用 7za 的命令行实用程序混淆了一个 vbs 脚本来压缩超过 7 天的文件。虽然大多数逻辑工作正常,但我能够将单个文件压缩成单个 zip 文件。
当我尝试将所有匹配文件添加到一个 zip 文件时,就会出现问题。下面是代码片段:
strCommand = "7za.exe -mx=9 a " & ObjectFolder & sysDate & ".zip " & strFileName
strRun = objShell.Run(strCommand, 0, True)
现在根据第 2行,设置True
将确保脚本将等待命令完成执行。但问题是7za
立即退出并进入下一个循环,处理下一个文件,因为它试图创建相同的 zip 文件,所以我收到拒绝访问错误。
有人可以帮我解决这个问题吗?
我还在命令提示符下测试了该场景。我所做的是,在单独的提示中同时执行以下 2 个命令:
提示1:C:\7za.exe -mx=9 a test.zip c:\sample1.pdf
提示2:C:\7za.exe -mx=9 a test.zip c:\sample2.pdf
提示 2 导致以下错误:
错误:不支持 test.zip 存档
系统错误:
该进程无法访问该文件,因为它正被另一个进程使用。
这是我在脚本中遇到的相同错误,我需要帮助来解决这个问题。任何指示都会有所帮助!
更新:
借助 John 和 Ansgar 提供的出色指示,我能够解决这个问题!原来是我的脚本中的一个错误!在我的脚本中,我在处理文件进行归档之前检查了该文件是否正在被任何其他进程使用。所以我通过打开文件进行检查,使用:
Set f = objFSO.OpenTextFile(strFile, ForAppending, True)
但是在继续处理同一个文件之前,我没有在脚本中关闭它,因此出现错误:该进程无法访问该文件,因为它正在被另一个进程使用
关闭文件后,一切顺利!
再次感谢我在这里得到的所有大力支持!
为了表示感谢,我将分享整个脚本以供任何人使用。请注意,我不是本文的原作者,我从各种来源收集了它,并对其进行了一些调整以满足我的需要。
存档.vbs
Const ForAppending = 8 ' Constant for file lock check
Dim objFSO, objFolder, objFiles, objShell
Dim file, fileExt, fileName, strCommand, strRun, strFile
Dim SFolder, OFolder, Extension, DaysOld, sDate
'''' SET THESE VARIABLES! ''''
SFolder = "C:\SourceFolder\" 'Folder to look in
OFolder = "C:\OutputFolder\" 'Folder to put archives in
Extension = "pdf" 'Extension of files you want to zip
DaysOld = 1 'Zip files older than this many days
''''''''''''''''''''''''''''''
sDate = DatePart("yyyy",Date) & "-" & Right("0" & DatePart("m",Date), 2) & "-" & Right("0" & DatePart("d",Date), 2)
'Create object for playing with files
Set objFSO = CreateObject("Scripting.FileSystemObject")
'Create shell object for running commands
Set objShell = wscript.createObject("wscript.shell")
'Set folder to look in
Set objFolder = objFSO.GetFolder(SFolder)
'Get files in folder
Set objFiles = objFolder.Files
'Loop through the files
For Each file in objFiles
fileName = Split(file.Name, ".")
fileExt = fileName(UBound(fileName))
'See if it is the type of file we are looking for
If fileExt = Extension Then
'See if the file is older than the days chosen above
If DateDiff("d", file.DateLastModified, Now()) >= DaysOld Then
strFile = file.Path
'See if the file is available or in use
Set f = objFSO.OpenTextFile(strFile, ForAppending, True)
If Err.Number = 70 Then ' i.e. if file is locked
Else
f.close
strFName = objFSO.GetBaseName(file.name)
strCommand = "C:\7za.exe -mx=9 a " & OFolder & sDate & ".zip " & strFile
strRun = objShell.Run(strCommand, 0, True)
'wscript.echo strCommand ' un-comment this to check the file(s) being processed
'file.Delete ' un-comment this to delete the files after compressing.
End If
End If
End If
Next
'Cleanup
Set objFiles = Nothing
Set objFolder = Nothing
Set objFSO = Nothing
Set objShell = Nothing
wscript.Quit
============================
谢谢
——诺曼 A。