两个变量的字符串批量比较

时间:2017-07-25 04:19:12

标签: batch-file md5

  

以下是我的代码。

import groovy.transform.builder.Builder

@Builder
class Foo {
    Map prop
}

def map = [a:1, b:2]
def f = Foo.builder().prop(map).build()
assert map == f.prop // or you can use f.getProp()
     

然而,结果是:

@ECHO off
SETLOCAL ENABLEDELAYEDEXPANSION

SET targetFile=%1
SET targetMD5=%2

::read MD5
CALL md5.exe -n %targetFile% > md5.txt
FOR /f "tokens=* delims=" %%i in (md5.txt) do (
SET FileMD5=%%i
)  
ECHO "FileMD5=%FileMD5%"
DEL md5.txt

::read MD5.txt
SET /A row=0
FOR /f "tokens=* delims=" %%f in (%targetMD5%) do (
SET OrgMD5=%%f
) 
ECHO "OrgMD5=%FileMD5%"

::compare
IF "%FileMD5%" EQU "%OrgMD5%" (
ECHO 1
) ELSE (
ECHO The target file was modified.
ECHO 0
)

ENDLOCAL
     

我认为FileMD5与OrgMD5相同。但EQU运营商并不这么认为。

     

如果我删除引号,代码变为:

"FileMD5=468C15F33FC55E6A388D505024ED723A"
"OrgMD5=468C15F33FC55E6A388D505024ED723A"
The target file was modified.
0
     

结果是:

::compare
IF %FileMD5% EQU %OrgMD5% (
ECHO 1
) ELSE (
ECHO The target file was modified.
ECHO 0
)
     

如果我将代码更改为:

"FileMD5=468C15F33FC55E6A388D505024ED723A"
"OrgMD5=468C15F33FC55E6A388D505024ED723A"
1
The target file was modified.
0
     

结果是我想要的,但MD5代码不应该总是468C15F33FC55E6A388D505024ED723A。

::compare
IF "%FileMD5%" EQU "468C15F33FC55E6A388D505024ED723A" (
ECHO 1
) ELSE (
ECHO The target file was modified.
ECHO 0
)

============================================== < / p>

我对错误的代码感到尴尬。所以我在下面更正了它。

"FileMD5=468C15F33FC55E6A388D505024ED723A"
"OrgMD5=468C15F33FC55E6A388D505024ED723A"
1

但是,这些“比较”总是会“失败”。

::read MD5.txt
SET /A row=0
FOR /f "tokens=1 delims= " %%f in (%targetMD5%) do (
SET OrgMD5=%%f
GOTO compare
)

:compare
ECHO "FileMD5=%FileMD5%"
ECHO "OrgMD5=%OrgMD5%"
IF "%FileMD5%" EQU %OrgMD5% (
GOTO pass
) ELSE (
GOTO fail
)

:pass
ECHO 1
GOTO :eof

:fail
ECHO The target file was modified.
ECHO 0
GOTO :eof

ENDLOCAL

1 个答案:

答案 0 :(得分:1)

在您进行的编辑中,您正在比较"%FileMD5%" EQU %OrgMD5%

只是为了更简单的例子,在FileMD5OrgMD5中设想值为foo

然后比较将产生:"foo" EQU foo一次引用,一次不引用。

所以你在这里有两个选择:在一边留下引号(通常不应该这样做)或者把它们放在另一边。

其他建议:为了逃避潜在的批处理元字符,我总是用它来比较:"x%var%" EQU "x%otherVar%"(带引号和前导x),以确保我没有在运行时可能不需要它们的地方。
注意:在@Aacini中注明their comment,x无关紧要。这是我曾经接过的东西,直到现在才放弃。