2015-01-15 63 views
0

我正在嘗試閱讀下面的註冊表。它是列表類型,其子鍵的數目是未知的。讀取註冊表類型列表,當子密鑰數量未知

HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Company\Domain\Config\Global\MACHINES_LIST\l1\C1 
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Company\Domain\Config\Global\MACHINES_LIST\l1\C2 
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Company\Domain\Config\Global\MACHINES_LIST\l1\C3 

....等等。某些條目少於20 C1包含V1 = 132.198.122.1 C2包含V1 = 132.198.122.2 ....

下面是我努力了這麼久的代碼,但沒有幫助。

setlocal ENABLEEXTENSIONS 
 
set KEY_NAME=HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Company\Domain\Config\Global\MACHINES_LIST\l1 
 
set VALUE_NAME=V1 
 

 
set /a loopChk=1 
 
set /a count=1 
 

 
:LOOPSATCON 
 
\t IF !loopChk! EQU 0 GOTO MOVE_OUT 
 
\t FOR /F "tokens=1-3" %%A IN ('REG QUERY %KEY_NAME%\C!count! /v %VALUE_NAME% 2^>nul') DO (
 
\t \t \t set IP=%%C 
 
\t \t \t set /a count=count+1 
 
\t \t) 
 
\t if defined ValueName (
 
\t \t @echo IP= %IP% 
 
\t) else (
 
\t \t @echo %KEY_NAME%\%VALUE_NAME% not found. 
 
\t \t set /a loopChk=0 
 
\t) 
 
\t GOTO LOOPSATCON


從 「答案」 傳輸

參考信息

不知怎的,我已成功地從存儲所有的C1,C2,C3 ...子鍵得到V1的價值。我將它們存儲在「ValueName」中並立即打印。但仍然沒有印刷。這是第一個腳本。謝謝你的幫助。 我是否再次犯了錯誤。 該語句正在執行「set ValueName = 172.16.121.73」,但該值仍未存儲。

set KEY_NAME=HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Compnay\Domain\Config\Modality\Global\MACHINES_IP\l1 

    FOR /F "skip=1" %%a IN ('REG QUERY %KEY_NAME% 2^>nul') DO (
     for /f "tokens=3" %%b in ('REG QUERY "%%a" ^| Find "V1"') do (
      set ValueName=%%b 
      @echo Value Name = %ValueName% 
     ) 
     if defined ValueName (
       @echo Value Name = %ValueName% 
      ) 
    ) 
+0

你真的有問題嗎?直接顯而易見的兩個錯誤是,您正在使用'!loopchk!'而未調用'enabledelayedexpansion',因此「!loopchk!」將永遠不會等於「0」('!'應該是'%') - 對於'!count!'也是一樣的(在這種情況下,您需要使用'enabledelayedexpansion',否則這只是一個字符串,而不是' count'。你已經使用了'如果定義的ValueName'總是爲false,因爲你設置的是'Value_Name'而不是'ValueName',並且你似乎沒有在循環中的任何位置給它賦值 – Magoo

回答

0

不知何故,我設法從所有的C1,C2,C3 ...子鍵中獲取V1的值。我將它們存儲在「ValueName」中並立即打印。但仍然沒有印刷。這是第一個腳本。謝謝你的幫助。 我是否再次犯了錯誤。 該語句正在執行「set ValueName = 172.16.121.73」,但該值仍未存儲。

set KEY_NAME=HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Compnay\Domain\Config\Modality\Global\MACHINES_IP\l1 
 
\t 
 
\t FOR /F "skip=1" %%a IN ('REG QUERY %KEY_NAME% 2^>nul') DO (
 
\t \t for /f "tokens=3" %%b in ('REG QUERY "%%a" ^| Find "V1"') do (
 
\t \t \t set ValueName=%%b 
 
\t \t \t @echo Value Name = %ValueName% 
 
\t \t) 
 
\t \t if defined ValueName (
 
\t   \t \t @echo Value Name = %ValueName% 
 
\t  ) 
 
\t)

+0

要添加額外的信息,你應該編輯你的問題,「答案」嚴格來說是解決問題的方法,爲了避免失去聲譽,你應該刪除這個答案 - 我已經將它編輯成你原來的問題了,還有 - 粘貼,不要重新鍵入,因爲它會增加由於拼寫錯誤導致的額外問題。通過在必要時用'mypassword'替換您的真實密碼來檢查敏感信息。很明顯,您已經重新輸入了這個信息,因爲您的原始發佈顯示爲'\ Company \'但是這顯示'\ Compnay \'。 – Magoo

0

會更容易些,如果我們有整個修改後的代碼,但是這是一個標準的delayedexpansion問題

在一個塊內聲明(a parenthesised series of statements),該整個塊進行解析,並然後執行。該塊內的任何%var%將在該塊被解析時由該變量的值取代 - 在塊執行之前 - 同樣的事情適用於FOR ... DO (block)

因此,在遇到IF時,將使用%variables%的值執行IF (something) else (somethingelse)。克服這個

兩種常用方法是:1)使用setlocal enabledelayedexpansion並使用!var!代替%var%訪問的var改變的值或2),以調用一個子程序使用改變的值來執行進一步的處理。

還請注意使用CALL ECHO %%var%%,它顯示更改值varCALL ECHO %%errorlevel%%顯示,但遺憾的是,然後RESETS錯誤級別。

所以 - 溶液1

setlocal ENABLEEXTENSIONS enabledelayedexpansion 

...

@echo Value Name = !ValueName! 

注意!var!代替的%var%用於顯示在延遲擴展模式下的更新後的值。

解決方案2(快速和容易的版本echo荷蘭國際集團的值)

CALL echo Value Name = %%ValueName%% 

請注意,如果你已經執行@echo off然後命令之前@是沒有必要的。

+0

Hi Magoo&StackOverflow,謝謝你的h ELP。 !ValueName!爲我工作。我創建了用於追加IP列表的批處理文件。 :) –