2

いくつかのファイルのいくつかのMd5を比較して、それらを別のドライブにコピーした後に同じであるかどうかを確認し、同じである場合は元のファイルを削除しようとしています。私はこれまでこのようなことをしたことがないので、構文に迷っています。

無料のユーティリティvmd5.exe(コマンドライン)を使用してmd5を取得しています。出力が同じである場合は、先に進んでファイルを削除することをvbscriptに伝える方法がわかりません。これは、2つのmd5を比較しようとしている部分のほんの一部ですが、これは私がこれまでに持っているものです。

Dim md5Command, md5Command2

md5Command = "C:\Program Files\vmd5.exe " vmd5 & " " & C:\Testscripts\ 
md5Command2 = "C:\Program Files\vmd5.exe " vmd5 & " " & E:\CopyTestFolder\

If md5Command = md5Command2 then 

objFSO.DeleteFolder("C:\ScriptOutput") 'Can either delete entire archived folder, or just .zip files in folder


objFSO.DeleteFile("C:\Testscripts\Archive*.evtx") 'This will be path where archived logs are located once finished

Else 

End If

この構文は確かに間違っています。しかし、私がIFについて知っていることから、私はそれがこのように見える必要があります。「set」部分のコマンドを実行するようにスクリプトに指示する必要があるかどうか、またはコマンドラインからmd5出力を取得して別の出力と比較するようにスクリプトに指示する方法がわかりません。

Elseステートメントの後、スクリプトを終了するか、異なるmd5を含むテキストファイルを出力するようにしたいのですが、まだその時点ではなく、実際には何も決定していません。

このようなことをするためのより良い方法があれば、私もそうするつもりですが、これが今朝私が思いついたすべてのことです。

編集:私は可能かもしれない何かを考えました。出力の内容をテキストファイルに出力するようにコマンドラインに指示すると、2つの異なるテキストファイルを比較でき、内容が一致する場合は、スクリプトの残りの部分に進むことができます。これを機能させる方法はわかりませんが、ロジックは理にかなっているようです。

作成されるテキストファイルの出力は次のようになります。

Vallen VMD5 R2009.1215

Filename                               MD5 sum
------------------------------------------------------------
[C:\ScriptOutput\]
Testzip.zip                     d5db2ff8c372a12c145170fb7340e682
4

1 に答える 1

1

タスクに取り組むには、いくつかのサブ問題を解決する必要があります。

  1. VBScriptでの文字列の連結:"... exe " vmd5 & " "-変数vmd5のコンテンツをつなぎ合わせるには、両側に連結演算子が必要です-しかし、それはあなたがやりたいことですか?" " & C:\Testscripts\-リテラル'C:\ Testscripts \'を追加するには、リテラルを(二重に)引用する必要があります-ただし、すべてのコンポーネントを1つの文字列リテラルに結合できます。
  2. VBScriptでは、「文字列リテラルの区切り文字として使用されます。より強力なスクリプト言語ではバックティックのようには機能しません。md5Commandは、実行するコマンドを保持する必要があります。そのコマンドの結果を取得するには、別のやかんです。
  3. コマンドをシェルアウト/実行するには、WScript.Shellオブジェクトの.Execまたは.Runメソッドを使用して、出力を収集する必要があります。
  4. 使用するツール(の出力)によっては、=演算子を使用して結果を比較することはできません。たとえば、パスやファイル/チェックサムの順序が異なる場合があります。したがって、キャプチャされた出力を解析するための戦略が必要になります。

最初に対処したいサブ問題はどれですか?

コメントが証明しているように、構文を正しく理解することが出発点になるはずです。これ:

  Dim aDirs : aDirs = Array("..\data\one", "..\data\two")
  ' Join an array of the components (no more problems
  ' with (forgetting (to concat)) separators)
  ' Use qq() function to lessen the noise
  Dim sCmdT : sCmdT = Join(Array( _
        "fciv" _
      , "-add" _
      , qq("§DIR§") _
  ), " ")
  Dim nDir, sDir, sCmd
  For nDir = 0 To UBound(aDirs)
      sDir = aDirs(nDir)
      ' Use replace on a template to avoid repetition
      sCmd = Replace(sCmdT, "§DIR§", sDir)
      WScript.Echo "sCmd: |" & sCmd & "|"
  Next

出力:

sCmd: |fciv -add "..\data\one"|
sCmd: |fciv -add "..\data\two"|

は、「ビルド」(シェル)コマンドまたはSQLステートメントを簡単に/エラーが発生しにくくするための3つの方法を示しています。(qq()関数の実装は演習として残されています)。

私はvmd5ユーティリティを持っていないので、以降の例ではfcivを使用します。

次の(バージョンの)スクリプト:

  Dim aDirs : aDirs = Array("..\data\one", "..\data\two")
  Dim sCmdT : sCmdT = Join(Array( _
        "fciv" _
      , "-add" _
      , qq("§DIR§") _
  ), " ")
  Dim oWSH : Set oWSH = CreateObject("WScript.Shell")
  Dim nDir, sDir, sCmd, oExec, sRes
  For nDir = 0 To UBound(aDirs)
      sDir = aDirs(nDir)
      sCmd = Replace(sCmdT, "§DIR§", sDir)
      Set oExec = oWSH.Exec(sCmd)
      sRes = oExec.Stdout.ReadAll()
      WScript.Echo sRes
  Next

出力:

CmpMd500 - compare md5 checksums
==============================================================
//
// File Checksum Integrity Verifier version 2.05.
//
09fea378b96141413f5f09444573f0f3 ..\data\one\version.txt
4945c1ffd9ceb14c83e003091c6e8455 ..\data\one\README.md
4c4c34f7b6f0863056615d2cbcdf6912 ..\data\one\History.txt

//
// File Checksum Integrity Verifier version 2.05.
//
09fea378b96141413f5f09444573f0f3 ..\data\two\version.txt
4945c1ffd9ceb14c83e003091c6e8455 ..\data\two\README.md
4c4c34f7b6f0863056615d2cbcdf6912 ..\data\two\History.txt

==============================================================

コマンドを実行して出力をキャプチャするための最小限のコードを示します。製品版では、エラー処理のために多くのコードを追加する必要があります。同時に、チェックサムを解析/比較する方法を説明するためのサンプル出力が表示されます。vmd5ユーティリティのサンプル出力を投稿できますか?

md5ユーティリティの出力を直接取得するか(上記のサンプル)、ファイルから取得するかにかかわらず、文字列をさらに処理できるデータに解析するには、正規表現が必要です。質問で公開したようなファイルを操作するための簡単なスクリプト:

  Dim reMd5File : Set reMd5File = New RegExp
  reMd5File.Global    = True
  reMd5File.Multiline = True
  reMd5File.Pattern   = "^(\S+)\s+(\w{32})"
  Dim sDir : sDir = "..\data\three"
  Dim oFile
  For Each oFile In goFS.GetFolder(sDir).Files
      Dim sAll : sAll = oFile.OpenAsTextStream(ForReading).ReadAll()
      WScript.Echo sAll
      Dim oMTS : Set oMTS = reMd5File.Execute(sAll)
      Dim oMT
      For Each oMT In oMTS
          WScript.Echo "** parsed:", qq(oMT.Submatches(1)), qq(oMT.Submatches(0))
      Next
  Next

出力:

CmpMd501 - compare md5 checksums
==================================================================
Vallen VMD5 R2009.1215

Filename                               MD5 sum
------------------------------------------------------------
[C:\ScriptOutput\]
Testzip.zip                     d5db2ff8c372a12c145170fb7340e682
version.txt                     09fea378b96141413f5f09444573f0f3
README.md                       4945c1ffd9ceb14c83e003091c6e8455
History.txt                     4c4c34f7b6f0863056615d2cbcdf6912

** parsed: "d5db2ff8c372a12c145170fb7340e682" "Testzip.zip"
** parsed: "09fea378b96141413f5f09444573f0f3" "version.txt"
** parsed: "4945c1ffd9ceb14c83e003091c6e8455" "README.md"
** parsed: "4c4c34f7b6f0863056615d2cbcdf6912" "History.txt"
********************
Vallen VMD5 R2009.1215

Filename                               MD5 sum
------------------------------------------------------------
[C:\ScriptOutput\]
Testzip.zip                     d5db2ff8c372a12c145170fb7340e682

** parsed: "d5db2ff8c372a12c145170fb7340e682" "Testzip.zip"
********************
==================================================================
xpl.vbs: Erfolgreich beendet. (0) [0.14844 secs]

そのコードで作業した後は、このスクリプトに問題はありません。これにより、「辞書への結果の保存」が「.Exec出力」バージョンに追加されます。

  Dim aDirs : aDirs = Array("..\data\one", "..\data\two")
  Dim sCmdT : sCmdT = Join(Array( _
        "fciv" _
      , "-add" _
      , qq("§DIR§") _
  ), " ")
  Dim oWSH : Set oWSH = CreateObject("WScript.Shell")

  ReDim aRes(UBound(aDirs))
  Dim reMd5File : Set reMd5File = New RegExp
  reMd5File.Global    = True
  reMd5File.Multiline = True
  reMd5File.Pattern   = "^(\w{32})\s(.+?)\s+$"

  Dim nDir, sDir, sCmd, oExec, sRes, oMTS, oMT
  For nDir = 0 To UBound(aDirs)
      sDir = aDirs(nDir)
      sCmd = Replace(sCmdT, "§DIR§", sDir)
      Set oExec = oWSH.Exec(sCmd)
      sRes = oExec.Stdout.ReadAll()
      Set aRes(nDir) = CreateObject("Scripting.Dictionary")
      Set oMTS = reMd5File.Execute(sRes)
      For Each oMT in oMTS
          aRes(nDir)(goFS.GetBaseName(oMT.SubMatches(1))) = oMT.SubMatches(0)
      Next
  Next

  Dim sFile
  For nDir = 0 To UBound(aDirs)
      For Each sFile In aRes(nDir).Keys
          WScript.Echo aRes(nDir)(sFile), sFile
      Next
      WScript.Echo
  Next

出力:

===========================================
09fea378b96141413f5f09444573f0f3 version
4945c1ffd9ceb14c83e003091c6e8455 README
0252535193507019a0eb97328d28dd80 robic
4c4c34f7b6f0863056615d2cbcdf6912 History

09fea378b96141413f5f09444573f0f3 version
4945c1ffd9ceb14c83e003091c6e8455 README
4c4c34f7b6f0863056615d2cbcdf6912 History
c46264f8101b6c1609c77b4c674bd327 Rakefile

===========================================

次の(そして最後の、私が望む)ステップは、比較を行うことです(1つのフォルダーからファイルが欠落していますか?、「同じ」ファイルのチェックサムは異なりますか?)。あなたの側から何かアイデアはありますか?

于 2012-07-11T15:22:58.843 に答える