2017-07-25 149 views
-1

以下是我的代码。字符串的两个变量字符串比较

@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=468C15F33FC55E6A388D505024ED723A" 
"OrgMD5=468C15F33FC55E6A388D505024ED723A" 
The target file was modified. 
0 

我觉得FileMD5是一样的OrgMD5。但是EQU运营商并不这么认为。

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

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

如果我的代码更改为:

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

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

"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 

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

"FileMD5=468c15f33fc55e6a388d505024ed723a" 
"OrgMD5=468c15f33fc55e6a388d505024ed723a" 
The target file was modified. 
0 
+3

'ECHO“OrgMD5 =%FileMD5%''应该是'ECHO'OrgMD5 =%orgMD5%''显示'orgmd5'的值 – Magoo

+2

我建议使用'for/F”delims =“%% I in ('md5.exe -n%targetFile%')设置“FileMD5 = %% I”而不是'CALL md5.exe -n%targetFile%> md5.txt'和'FOR/f“标记= * delims = “%% i in(md5.txt)do('和接下来的两行,在命令提示符窗口中运行for /?'以获得多个页面上该命令输出的帮助。”'delims =“'选项字符串没有必要,如果'md5.exe'只输出MD5总和而没有别的。 – Mofi

+0

使用[fc](https://ss64.com/nt/fc.html)来验证相同的文件(只是为了确保.. ) – Stephan

回答

1

在编辑时,您是对比"%FileMD5%" EQU %OrgMD5%

举个简单的例子,想象一下FileMD5OrgMD5的值是foo

然后比较会产生:"foo" EQU foo一次带引号,一次不带。

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

其他建议:为了逃避潜在的批次元字符,我总是用它来比较:"x%var%" EQU "x%otherVar%"(带引号和前导x),以确保我没有在运行时不需要的地方放置括号。
备注:由于@Aacinitheir comment中注明,所以x是无关紧要的。这是我一次拿起的东西,直到现在从未放弃。

+1

关于将“x”包含在“转义潜在批次元字符”中的建议毫无意义。一个“x”字母不会转义任何东西,并且在引号(如圆括号)中包含的任何字符不会在运行时处理... – Aacini

+0

我明白了。我在写作的时候真的很想知道这件事。我曾经在头脑中用这种解释捡起它,并总是以这种方式使用它。将添加一个说明:)感谢提示@Aacini – geisterfurz007