VBscript比较md5“If then then”

时间:2012-07-11 14:13:07

标签: vbscript compare md5

我试图比较一些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

1 个答案:

答案 0 :(得分:1)

要解决您的任务,您必须解决一些子问题:

  1. VBScript中的字符串连接:"... exe " vmd5 & " " - 要拼接变量vmd5的内容,你需要双方的连接运算符 - 但这是你想要做的吗? " " & C:\Testscripts\ - 要附加文字'C:\ Testscripts \',您需要(双)引用文字 - 但是您可以将所有组件合并为一个字符串文字。
  2. 在VBScript中“用作字符串文字分隔符;它们不像更强大的脚本语言中的反引号那样工作。 md5Command 必须保存您要执行的命令;要获得结果该命令是一个不同的鱼。
  3. 要发出/执行命令,您必须使用WScript.Shell对象的.Exec或.Run方法并收集输出。
  4. 根据您使用的工具的(输出),您将无法通过=运算符比较结果 - 例如pathes或文件/ cheksums的顺序可能不同。因此,您需要一种解析捕获输出的策略。
  5. 您想先处理哪个子问题?

    正如您的评论所证明的那样,正确的语法应该是起点。这样:

      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
    
    ===========================================
    

    接下来 - 最后,我希望 - 步骤是进行比较(文件中是否缺少文件?,'同一'文件的校验和是否不同?)。你身边有什么想法吗?