2015-11-05 55 views
1

我需要檢查註冊表項的值,如果值爲12,則轉到標籤「exit」,如果11轉到標籤「exiSt」。我在下面做錯了什麼?在.bat上檢查註冊表值

@echo off 

reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\2C58473D30CCBEE4B9AF1E04A90EA0C6\InstallProperties /v DisplayVersion 

for /f "tokens=2" %i in ('reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\2C58473D30CCBEE4B9AF1E04A90EA0C6\InstallProperties /v DisplayVersion') do (if %i == "12.5.2000.01063" goto exit if %i == "11.1.0.07015" goto exiSt) 

:exit 

Echo exit 

:exiSt 

Echo continue script bellow 
+0

嘗試'tokens = 3'。 –

+0

在文中你說「如果值是12」,但在你的代碼示例中,你將一個值與'12.5.2000 ....'進行比較;所以請澄清 - 你真的想檢查什麼? – aschipfl

回答

0
  • 您需要使用雙百分號%% for循環變量在批處理文件。請注意,這與在shell中直接使用FOR命令不同:在那裏,您只需要一個百分號%
  • 註冊表項的值作爲第三個字段輸出,而不是第二個。
  • 如果您想在單行上執行IF -then- ELSE,則需要在兩個塊周圍使用括號。但在這種情況下可以避免這種情況。

總結:

FOR /F "tokens=3" %%i IN ('reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\2C58473D30CCBEE4B9AF1E04A90EA0C6\InstallProperties /v DisplayVersion') DO (
    IF "%%i"=="12.5.2000.01063" GOTO exit 
    IF "%%i"=="11.1.0.07015" GOTO exiSt 
) 
+0

這兩個「回聲」仍然顯示 – Francisco

+0

@Francisco:這意味着兩個「IF」都沒有匹配。注意我沒有機會看到你的'reg query'調用實際返回的數據。試着在'IF'之前做'ECHO %% i',看看會發生什麼。 – zb226

0

@ zb226已經指出你的代碼的幾個問題在他的answer。但是,還有更多:

  • 您需要告訴腳本在每段後退出;目前,當您跳轉到:exit部分時,由於在其末尾沒有exit /Bgoto :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的每個其他值。當然,您可以根據自己的需求來調整。