2017-07-25 150 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