2015-05-11 143 views
1

我寫了一個批處理文件(heavily influenced from answers to this question),它應該循環遍歷幾個鍵值並返回值不存在的第一個實例。循環返回意外的結果

問題是,我似乎無法得到它返回一個不存在的值的第一個實例;它要麼貫穿整個循環,要麼返回實際存在的值。

我的代碼:

@echo OFF 

setlocal ENABLEEXTENSIONS 
set KEY_NAME="HKEY_CURRENT_USER\SOFTWARE\MICROSOFT\OFFICE\15.0\Excel\Options" 
REM set VALUE_NAME=OPEN 

FOR %%V IN (OPEN OPEN1 OPEN2 OPEN3 OPEN4 OPEN5 OPEN6 OPEN7 OPEN8 OPEN9 OPEN10 OPEN11 OPEN12 OPEN13 OPEN14 OPEN15 OPEN16 OPEN17 OPEN18 OPEN19) DO (
    FOR /F "usebackq skip=2 tokens=1" %%A IN (`REG QUERY %KEY_NAME% /v %%V 2^>nul`) DO (
     set ValueName=%%A 
     rem set ValueType=%%B 
     rem set ValueValue=%%C 
     if "%ValueName%"=="" (
      @echo %KEY_NAME%\%%V not found. 
      PAUSE 
      GOTO :ADD_KEY 
     ) 
    ) 
) 
CLS 
echo loop finished 
PAUSE 
exit 

:ADD_KEY 
CLS 
ECHO IT WORKED 
PAUSE 

在我的測試中,上面的代碼返回如下:

"HKEY_CURRENT_USER\SOFTWARE\MICROSOFT\OFFICE\15.0\Excel\Options"\OPEN not found 

即使它實際上確實存在我的機器上。

如果我將If語句標準更改爲Not Defined ValueName,則返回loop finished

我在這裏做錯了什麼?我可能錯過了一些簡單的事情,但我的谷歌搜索一直沒有成果。

注意:這些值(OPEN,OPEN1,OPEN2等)對應於已啓用 Excel加載項。

編輯

所以目前我的機器有值OPEN,但它不具有的價值OPEN1。這裏的目標是在找到一個不存在的值(在這種情況下爲OPEN1)時,將退出循環,並執行代碼段ADD_KEY

回答

1

不幸的是,你不告訴我們你期望什麼,爲什麼你期望什麼。

使用你的代碼,ValueName最初將沒有任何價值,因此在第一循環中,與​​3210設置爲OPEN因爲你還沒有啓用delayedexpansion和你正在使用的%ValueName%聲明if作爲if ""==""評估。因此,您收到消息...OPEN

如果更換ifif defined版本,那麼你得到loop finished的事實意味着在列表中的每個條目(OPEN OPEN1 ...)發現。

我們不知道您的機器是否屬實。您可以通過故意刪除您期望存在的密鑰來進行測試。

AAMOI,set "ValueName=%%A"是更好的語法,因爲它使分配免疫於討厭的不可見的尾隨空格。

環內的@echo可以安全地爲echo。所有@在執行命令之前都會抑制該命令的回顯,因此最初的@echo off會抑制回顯,但需要自行抑制。

爲什麼使用if "%ValueName%"==""if "%%A"==""會完成同樣的事情沒有delayedexpansion

修訂

FOR /F "usebackq skip=2 tokens=1" %%A IN (`REG QUERY %KEY_NAME% /v %%V 2^>nul`) DO (

執行do如果reg query沒有返回結果的機構。

嘗試

FOR %%V IN (OPEN OPEN1 OPEN2 OPEN3 OPEN4 OPEN5 OPEN6 OPEN7 OPEN8 OPEN9 OPEN10 OPEN11 OPEN12 OPEN13 OPEN14 OPEN15 OPEN16 OPEN17 OPEN18 OPEN19) DO (

set "ValueName=" 

FOR /F "usebackq skip=2 tokens=1" %%A IN (`REG QUERY %KEY_NAME% /v %%V 2^>nul`) DO (
    set ValueName=%%A 
    rem set ValueType=%%B 
    rem set ValueValue=%%C 

) 
if not defined ValueName (
    echo %KEY_NAME%\%%V not found. 
    PAUSE 
    GOTO ADD_KEY 
) 
) 

也就是說,設置valuename什麼,使用內for設置所需的值(一個或多個),如果失敗(從reg query沒有輸出),那麼你已經找到了缺少鑰匙。

+0

你說得對,我很抱歉,那是我的疏忽。在我的機器上,OPEN存在,但沒有其他OPEN值存在(即OPEN1,OPEN2等)。所以我希望它返回第一個不存在的值,在這種情況下是OPEN1。我已經證實OPEN存在,而OPEN1不存在。 – ARich

+0

你應該'編輯'這個額外的信息到問題中。看來'%% A'或'Valuename' **被設置爲缺席值。也許顯示用'ECHO(%% A)'找到的值會揭示爲什麼。 – Magoo

+0

我的問題已更新。當我回顯%% A時,它顯示'%A',當我回顯%ValueName%時'ECHO is off'。我在這裏真的很茫然。 – ARich