@ zb226已經指出你的代碼的幾個問題在他的answer。但是,還有更多:
- 您需要告訴腳本在每段後退出;目前,當您跳轉到
:exit
部分時,由於在其末尾沒有exit /B
或goto :EOF
命令,因此執行進入:exiSt
部分;
- 您不應該使用
exit
作爲標籤,因爲還有exit
命令;儘管這樣的標籤有效,但它可能會使代碼更難以閱讀;
假如你只是想11.#...
和12.#...
區分,你可以做到以下幾點:
for /F "tokens=3" %%V in ('
reg query^
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\2C58473D30CCBEE4B9AF1E04A90EA0C6\InstallProperties^
/v DisplayVersion
') do (if "%%V" lss "12" (goto :exiSt) else (goto :exi_t))
exit /B
:exi_t
echo exit script
goto :EOF
:exiSt
echo continue script below
這使用的字符串比較;以11
開頭的字符串總是被認爲小於12
,所以這可以工作。但是,此方法在3210包含像9.#...
或100.#...
這樣的字符串時失敗。
你也可以做這樣的數值比較(假設該註冊表值開始的數字):
for /F "tokens=3" %%V in ('
reg query^
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\2C58473D30CCBEE4B9AF1E04A90EA0C6\InstallProperties^
/v DisplayVersion
') do (set /A "VALUE=%%V")
if not defined VALUE exit /B
if %VALUE% equ 11 (goto :exiSt) else (goto :exi_t)
:exi_t
echo exit script
goto :EOF
:exiSt
echo continue script below
的set /A
命令定義一個臨時變量VALUE
和註冊表值作爲分配給它數;第一個非數字字符和後面的所有內容都被忽略,這就是我們的情況下的.
。因此,像12.#...
這樣的字符串被轉換爲數字12
。
由於在比較表達式周圍沒有""
,所以比較以數字方式完成。因此,即使該值爲9.#...
或100.#...
,也是如此。
這裏的邏輯只是檢查註冊表值是否以11
開頭,並跳轉到:exiSt
,或者跳轉到:exi_t
的每個其他值。當然,您可以根據自己的需求來調整。
嘗試'tokens = 3'。 –
在文中你說「如果值是12」,但在你的代碼示例中,你將一個值與'12.5.2000 ....'進行比較;所以請澄清 - 你真的想檢查什麼? – aschipfl