2016-09-09 38 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 ..它为我工作... –

相关问题