我试图比较一些Md5的一些文件,看看它们是否在我将它们复制到另一个驱动器之后是相同的,如果它们是相同的则删除原始文件。我迷失在语法上,因为我之前从未做过类似的事情。
我正在使用免费的实用程序vmd5.exe(命令行)来获取md5。我只是不确定如何告诉vbscript如果输出是相同的,那么继续并删除文件。这只是我试图比较两个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的文本文件,但我还没有达到这一点,并且还没有真正决定任何事情。
如果有更好的方式来做这样的事情,我也会做到这一点,这就是我今天早上想出的所有事情。
编辑:我想到了可能的事情。如果我告诉命令行将输出的内容输出到文本文件,那么我可以比较两个不同的文本文件,如果内容匹配,那么它可以继续执行脚本的其余部分。我不知道如何让它工作,但逻辑似乎是有道理的。
以下是它创建的文本文件的输出如下:
Vallen VMD5 R2009.1215
Filename MD5 sum
------------------------------------------------------------
[C:\ScriptOutput\]
Testzip.zip d5db2ff8c372a12c145170fb7340e682
答案 0 :(得分:1)
要解决您的任务,您必须解决一些子问题:
"... exe " vmd5 & " "
- 要拼接变量vmd5的内容,你需要双方的连接运算符 - 但这是你想要做的吗? " " & C:\Testscripts\
- 要附加文字'C:\ Testscripts \',您需要(双)引用文字 - 但是您可以将所有组件合并为一个字符串文字。您想先处理哪个子问题?
正如您的评论所证明的那样,正确的语法应该是起点。这样:
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"|
说明了3种方法,可以使“构建”(shell)命令或SQL语句更容易/更少错误。 (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]
通过该代码后,您将对此脚本没有任何问题 '将结果存储在词典中'到'read .Exec output'版本:
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
===========================================
接下来 - 最后,我希望 - 步骤是进行比较(文件中是否缺少文件?,'同一'文件的校验和是否不同?)。你身边有什么想法吗?