是否有任何方法可以獲得帶後綴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
要了解批次代碼,打開命令提示窗口中,執行下面的命令,讀幫助輸出爲每個命令。
for /?
if /?
reg query /?
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
版本,分析他們在這裏記錄它,這將是對我來說絕對是有幫助的,希望也爲他人在未來之間的輸出差異。
感謝@Mofi,當我嘗試打印變量出局部爲什麼不解決? 如果ABC的值是IP,我如何在兩個IP之間使用新行命令,即'\ n'。在單變量方法中,它解析爲1.1.1.1; 2.2.2.2 – Lastwish 2015-03-20 09:20:35
請參閱例如[多行文本文件,如何放入環境變量](http://stackoverflow.com/questions/10607739/)您可以在哪裏請參閱如何使用換行符將環境變量定義爲字符串值,該字符串值可以引用而不是分號將IP地址獲取到由行結尾分隔的變量中。 – Mofi 2015-03-20 11:18:01
''setlocal'通常用於批處理文件的開頭,批處理文件結尾處的'endlocal'如果根本不省略的話。這樣可以避免將由'setlocal'創建的新環境變量列表中的局部變量的值傳遞給'endlocal'上恢復的以前的環境變量列表。 – Mofi 2015-03-20 11:38:47