0

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。

4

2 に答える 2

1

あなたのコマンドは7za、そのタスクが完了する前に戻るべきではありません(そしてそれは私のテストにはありません)。コードを次のように変更してみてください。そうすれば、何が起こっているのかを確認できます。

strCommand = "7za.exe -mx=9 a " & ObjectFolder & sysDate & ".zip " & strFileName
strCommand = "%COMSPEC% /k " & strCommand
strRun = objShell.Run(strCommand, 1, True)

ファイル名を引用することもお勧めします。

Function qq(str)
  qq = Chr(34) & str & Chr(34)
End Function

strCommand = "7za.exe -mx=9 a " & qq(ObjectFolder & sysDate & ".zip") & " " _
  & qq(strFileName)
于 2012-10-19T08:04:30.523 に答える
1

あなたが求めていたものとはまったく異なりますが、当面の問題を乗り越えるのに役立つ場合に備えて、同様のタスクに使用するバッチスクリプトを次に示します。

ArchiveScriptLog.Bat

::ensure we're in the right directory, then run the script & log the output
cls
pushd "c:\backup scripts"
ArchiveScript.bat > ArchiveScript.log
popd

ArchiveScript.bat

::Paths (must include the \ on the end).  There must be no space between the equals and the value
::UNC paths are acceptable

Set FolderToBackup=F:\EnterpriseArchitect\Energy\
Set BackupPath=F:\EnterpriseArchitect\!ARCHIVE\
Set RemoteBackupPath=\\ukccojdep01wok\h$\Energy\cciobis01edc\
Set SevenZip=C:\Program Files (x86)\7-Zip\

::Get DATE in yyyymmdd format; done in two lines to make it easy to change the date format
FOR /F "TOKENS=2,3,4 DELIMS=/ " %%A IN ('echo %Date%') DO (SET mm=%%A&SET dd=%%B&SET yyyy=%%C)
SET strDate=%yyyy%%mm%%dd%

::Set the Backup File to be the backup path with the current date & .zip on the end
Set BackupFile=%BackupPath%%strDate%.zip

::create a zip containing the contents of folderToBackup
pushd %SevenZip%
7z a "%BackupFile%" "%FolderToBackup%"
popd

::go to the archive directory & copy all files in there to the remote location (this accounts for previous errors if the network were unavailable)
pushd "%BackupPath%"
move *.zip "%RemoteBackupPath%"
popd

::delete off backups in the remote location which are older than 90 days
pushd "%RemoteBackupPath%"
forfiles /D -90 /M *.zip /C "cmd /c del @file"
popd
于 2012-10-18T22:03:07.463 に答える