7zaのコマンドラインユーティリティを使用して7日より古いファイルを圧縮するためにvbsスクリプトをごちゃ混ぜにしました。ほとんどのロジックは正常に機能しますが、単一のファイルを単一のzipファイルに圧縮することができます。
一致するすべてのファイルを1つの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はアーカイブをサポートしていません
システムエラー:
別のプロセスによって使用されているため、プロセスはファイルにアクセスできません。
これは、スクリプトで発生しているのと同じエラーであり、これを解決するために支援が必要です。どんなポインタも役に立ちます!
アップデート:
ジョンとアンスガーの両方から提供された素晴らしいポインターで、私はこれを解決することができました!それは私のスクリプトのバグであることが判明しました!私のスクリプトには、アーカイブ用にファイルを処理する前に、ファイルが他のプロセスで使用されているかどうかを確認するためのチェックを含めました。だから私はこれをチェックして、次を使用して追加するファイルを開きました。
Set f = objFSO.OpenTextFile(strFile, ForAppending, True)
しかし、同じファイルの処理に進む前に、スクリプトでファイルを閉じていなかったため、エラーが発生しました。別のプロセスで使用されているため、プロセスはファイルにアクセスできません。
ファイルを閉じた後、すべてうまくいきました!
私がここで得たすべての素晴らしいサポートにもう一度感謝します!
感謝のしるしとして、私は誰でも使用できるようにスクリプト全体を共有しています。私はこれの原作者ではないことに注意してください。さまざまなソースから収集し、ニーズに合わせて少し調整しました。
Archive.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。