タスクに取り組むには、いくつかのサブ問題を解決する必要があります。
- VBScriptでの文字列の連結:
"... exe " vmd5 & " "
-変数vmd5のコンテンツをつなぎ合わせるには、両側に連結演算子が必要です-しかし、それはあなたがやりたいことですか?" " & C:\Testscripts\
-リテラル'C:\ Testscripts \'を追加するには、リテラルを(二重に)引用する必要があります-ただし、すべてのコンポーネントを1つの文字列リテラルに結合できます。
- VBScriptでは、「文字列リテラルの区切り文字として使用されます。より強力なスクリプト言語ではバックティックのようには機能しません。md5Commandは、実行するコマンドを保持する必要があります。そのコマンドの結果を取得するには、別のやかんです。
- コマンドをシェルアウト/実行するには、WScript.Shellオブジェクトの.Execまたは.Runメソッドを使用して、出力を収集する必要があります。
- 使用するツール(の出力)によっては、=演算子を使用して結果を比較することはできません。たとえば、パスやファイル/チェックサムの順序が異なる場合があります。したがって、キャプチャされた出力を解析するための戦略が必要になります。
最初に対処したいサブ問題はどれですか?
コメントが証明しているように、構文を正しく理解することが出発点になるはずです。これ:
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つのフォルダーからファイルが欠落していますか?、「同じ」ファイルのチェックサムは異なりますか?)。あなたの側から何かアイデアはありますか?