2015-03-19 73 views
0

說存在於註冊表中的位置:基於密鑰的數目動態地獲取註冊表鍵值

HKEY_CURRENT_USER\Software\ABC\XYZ\ 

在該位置有多個值目前,還沒有固定數量。但值名稱具有相同前綴像ABC0ABC1ABC2,...

一般我會用這個查詢獲取每個單獨的值:

FOR /F "usebackq tokens=3*" %%A IN (`REG QUERY "HKEY_CURRENT_USER\Software\ABC\XYZ\" /v ABC0`) DO (
    SET Value=%%A 
) 

這將設置ABC0的值到變量的值

但我不知道可能存在的值的數量。

是否有任何方法獲得所有的後綴ABC(在上述位置)的值,並將它們存儲到一個變量或將它們存儲在多個變量中?

是這樣的:

值1 = Value_of_ABC0
值2 = Value_of_ABC1
等。

+0

感謝@Mofi,當我嘗試打印變量出局部爲什麼不解決? 如果ABC的值是IP,我如何在兩個IP之間使用新行命令,即'\ n'。在單變量方法中,它解析爲1.1.1.1; 2.2.2.2 – Lastwish 2015-03-20 09:20:35

+0

請參閱例如[多行文本文件,如何放入環境變量](http://stackoverflow.com/questions/10607739/)您可以在哪裏請參閱如何使用換行符將環境變量定義爲字符串值,該字符串值可以引用而不是分號將IP地址獲取到由行結尾分隔的變量中。 – Mofi 2015-03-20 11:18:01

+0

''setlocal'通常用於批處理文件的開頭,批處理文件結尾處的'endlocal'如果根本不省略的話。這樣可以避免將由'setlocal'創建的新環境變量列表中的局部變量的值傳遞給'endlocal'上恢復的以前的環境變量列表。 – Mofi 2015-03-20 11:38:47

回答

1

是否有任何方法可以獲得帶後綴ABC(在上述位置)的所有值並將它們存儲到變量中或將它們存儲在多個變量中?

這個問題可以回答:

是的,有一種方式來獲得所有的值,並將其存儲在一個或多個變量。

但是您很可能對此任務的代碼感興趣。

批處理文件將每個值存儲在單獨的環境變量中。

@echo off 
setlocal EnableDelayedExpansion 
set "Count=1" 
for /F "skip=2 tokens=1,2*" %%A in ('%SystemRoot%\System32\reg.exe query "HKCU\Software\ABC\XYZ"') do (
    set "ValueName=%%A" 
    if /I "!ValueName:~0,3!"=="ABC" (
     set "Value!Count!=%%C" 
     set /A Count+=1 
    ) 
) 
endlocal 

批處理文件的所有值存儲在一個環境變量:

@echo off 
setlocal EnableDelayedExpansion 
set "Value=" 
for /F "skip=2 tokens=1,2*" %%A in ('%SystemRoot%\System32\reg.exe query "HKCU\Software\ABC\XYZ"') do (
    set "ValueName=%%A" 
    if /I "!ValueName:~0,3!"=="ABC" (
     if not "!Value!"=="" set "Value=!Value!;" 
     set "Value=!Value!%%C" 
    ) 
) 
endlocal 

要了解批次代碼,打開命令提示窗口中,執行下面的命令,讀幫助輸出爲每個命令。

  1. for /?
  2. if /?
  3. reg query /?
  4. set /?

加成在參考由Rafael發表評論。

reg.exe Windows 2000和Windows XP不支持變量名稱的通配符。自Windows Vista以來,變量名稱中的通配符僅受reg.exe支持。

reg.exe的輸出取決於版本和使用的命令。在Windows XP

輸出使用命令

%SystemRoot%\System32\reg.exe query "HKCU\Software\ABC\XYZ" 

  
! REG.EXE VERSION 3.0 

HKEY_CURRENT_USER\Software\ABC\XYZ 
    ABC0  REG_SZ Hello! 
    ABC1  REG_SZ Okay. Let's go. 
    ABC2  REG_SZ Finished. 

輸出一個空白行開始。下一行是版本信息。第三行再次是空白行。第四行是註冊表項。然後,帶有值的行隨後有4個空格作爲縮進值和值名稱,值類型和值字符串之間的選項卡。在Windows 7

輸出使用命令

%SystemRoot%\System32\reg.exe query "HKCU\Software\ABC\XYZ" 

  
HKEY_CURRENT_USER\Software\ABC\XYZ 
    ABC0 REG_SZ Hello! 
    ABC1 REG_SZ Okay. Let's go. 
    ABC2 REG_SZ Finished. 

第一行再次是一個空行。沒有版本信息。因此,第二行已經包含註冊表項,當然這些註冊表項還可以包含一個或多個空格。然後,帶有值的行隨後以4個空格作爲縮進,並且值名稱,值類型和值字符串之間也有4個空格。在Windows 7

輸出使用命令

%SystemRoot%\System32\reg.exe query "HKCU\Software\ABC\XYZ" /v ABC* 

  
HKEY_CURRENT_USER\Software\ABC\XYZ 
    ABC0 REG_SZ Hello! 
    ABC1 REG_SZ Okay. Let's go. 
    ABC2 REG_SZ Finished. 

End of search: 3 match(es) found. 

相較於先前的輸出現在還有一個空行,並且也包含幾個空格的摘要信息。

結論:

像現在在更新的代碼做是安全的,跳過前兩行的reg.exe輸出。

但是在Windows Vista,Windows 7,Windows 8或Windows 8.1上無法使用下面的簡化代碼,因爲搜索摘要行。

@echo off 
setlocal EnableDelayedExpansion 
set "Value=" 
for /F "skip=2 tokens=2*" %%A in ('%SystemRoot%\System32\reg.exe query "HKCU\Software\ABC\XYZ" /v ABC* ') do (
    if not "!Value!"=="" set "Value=!Value!;" 
    set "Value=!Value!%%B" 
) 
endlocal 

然而,由於Rafael但他的評論讓我看好的reg.exe版本,分析他們在這裏記錄它,這將是對我來說絕對是有幫助的,希望也爲他人在未來之間的輸出差異。

+0

很好的答案,但實際上您不需要驗證值名稱的第一個字符。在命令結尾添加'/ v ABC *'將僅過濾* ABC *起始名稱。像這樣:'... in('reg query「HKCU \ Software \ ABC \ XYZ」'/ v ABC *)'。但是你必須跳過顯示搜索結果的最後一行。 – Rafael 2015-03-19 07:01:27

+0

當我在CMD中直接使用CM *的reg *查詢時,它可以工作,但是當我嘗試使用FOR命令通過腳本將值存儲在一個變量中時,我只是得到'Search:' – Lastwish 2015-03-19 07:15:35