2016-09-09 61 views
0

我需要從批處理腳本讀取註冊表的默認值。某些項目的名稱包含一些空格。另外我想執行一次兩個循環的批處理文件。閱讀由空格和字符串值分隔的詞也包含批處理腳本中的空間

rem @echo OFF 

setlocal ENABLEEXTENSIONS 
set KEY_NAME="HKEY_CURRENT_USER\Software\abc\xyz pqr" 

FOR /F "tokens=1-3 delims=<TAB>" %%A IN ('REG QUERY %KEY_NAME% 2^>nul') DO (
    set ValueName=%%A 
    set ValueType=%%B 
    set ValueValue=%%C 
) 
if defined ValueName (
    @echo Value Name = %ValueName% 
    @echo Value Type = %ValueType% 
    @echo Value Value = %ValueValue% 
) else (
    @echo %KEY_NAME%\%VALUE_NAME% not found. 
) 
pause 

它提供了以下輸出

rem @echo OFF 

setlocal ENABLEEXTENSIONS 

set KEY_NAME="HKEY_CURRENT_USER\Software\abc\xyz pqr" 

FOR /F "tokens=1-3 delims=<TAB>" %A IN ('REG QUERY "HKEY_CURRENT_USER\Software\abc\xyz pqr" 2>nul') DO (
set ValueName=%A 
set ValueType=%B 
set ValueValue=%C 
) 

(
set ValueName=HKEY_CURREN 
set ValueType=_USER\Software\abc\xyz pq 
set ValueValue= 
) 

(
set ValueName= (Default) REG_SZ C:\Program Files (x86)\abc\ 
set ValueType= 
set ValueValue= 
) 

(
set ValueName= 
set ValueType=uthor REG_SZ gj 
set ValueValue= 
) 

(
set ValueName= Version REG_SZ 1.4.0.0 
set ValueType= 
set ValueValue= 
) 

if defined ValueName (



) else() 
Value Name =  Version REG_SZ 1.4.0.0 
Value Type = 
Value Value = 

pause 
Press any key to continue . . . 

我想獲得以下輸出,也希望這個for循環應該停止,一旦我得到(默認)

(
set ValueName=(Default) 
set ValueType=REG_SZ 
set ValueValue=C:\Program Files (x86)\abc\ 
) 

感謝的價值提前幫助我!

+0

您需要[延期擴展](http://ss64.com/nt/delayedexpansion.html)。要使用_space_和_tab_作爲分隔符,只需省略'delims'選項,因爲它們是默認的; ''指定從字面上使用這五個字符... – aschipfl

回答

0

此批註代碼應該適用於Windows XP及更高版本Windows上的此任務。

@echo off 
rem On Windows Vista and later REG.EXE outputs without version info: 

rem HKEY_CURRENT_USER\Software\abc\xyz pqr 
rem (Default) REG_SZ C:\Program Files (x86)\abc\ 

rem There are only spaces used to separate value name, value type and value string. 


rem But REG.EXE version 3.0 outputs on Windows XP with version info: 

rem ! REG.EXE VERSION 3.0 
rem 
rem HKEY_CURRENT_USER\Software\abc\xyz pqr 
rem  <NO NAME> REG_SZ C:\Program Files (x86)\abc\ 

rem NOTE: There are 4 indent spaces and 2 separating tabs in REG 3.0 output line. 


rem So either token 2 or token 3 contains value type REG_SZ 
rem used to identify the line with the wanted information. 
set "TypeToken=2" 

:GetPathFromRegistry 
for /F "skip=1 tokens=%TypeToken%*" %%A in ('%SystemRoot%\System32\reg.exe QUERY "HKCU\Software\abc\xyz pqr" /ve 2^>nul') do (
    if "%%A" == "REG_SZ" (
     set "AppPath=%%~B" 
     goto HaveAppPath 
    ) else if "%%A" == "NAME>" (
     set "TypeToken=3" 
     goto GetPathFromRegistry 
    ) 
) 

echo Failed to read application path from registry. 
pause 
goto :EOF 

:HaveAppPath 
echo Application path is: %AppPath% 
pause 

在Windows Vista和更高版本的Windows版本的FOR循環過程從輸出REG只有1行。

在Windows XP和Windows Server 2003中,FOR循環使用不同的值運行兩次tokens=X*和3.0 reg.exe版本得到的,因爲版本信息輸出感興趣的字符串值之前處理更多的線路。

爲了解所使用的命令及其工作方式,請打開命令提示符窗口,在其中執行以下命令,並仔細閱讀爲每個命令顯示的所有幫助頁面。

  • echo /?
  • for /?
  • goto /?
  • if /?
  • pause /?
  • reg /?
  • reg query /?
  • set /?
+0

感謝Mofi ..它爲我工作... –

相關問題