这些REG查询命令之间的区别在于批量传递给For循环,尾随'\'

时间:2015-02-17 16:41:25

标签: cmd

for /f "tokens=3" %%i in ('REG QUERY HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\%n%\ /v InstallDir') do set dir=%%i

for /f "tokens=3" %%i in ('REG QUERY HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\%n%(%id%)\ /v InstallDir') do set dir=%%i

出于某种原因,第一个for循环工作,而第二个失败。 Cmd表示,它并没有预料到会落后' \'之后(%id%)

所以我必须像这样写

for /f "tokens=3" %%i in ('REG QUERY HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\%name%(%a%) /v InstallDir') do set dir=%%i

有谁知道为什么落后' \'在第一个for循环中是可以接受的但不是第二个吗?

CausingUnderflowsEverywhere提出的完全有效的问题对于有类似问题的其他人可能有用,但不幸的是过早地删除了错误的结论。

(作为记录)

2 个答案:

答案 0 :(得分:0)

使用前面的插入符^来逃避违规)告诉批处理右括号是数据的一部分而不是命令。

(正如我所说,它只是为了纠正错误观念)

答案 1 :(得分:0)

使用双引号转义所有违规字符,如下所示:

for /f "tokens=3" %%i in ('
  REG QUERY "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\%n%(%id%)" /v InstallDir
    ') do set "dir=%%i"
即使%n%%id%包含空格字符,

也应该有效。

重要双引号注册表项名称中没有结尾\反斜杠。

使用其他包含空格的注册表项进行验证,()括号,|垂直线(管道),<>重定向器......

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Connection Manager
HKLM\SOFTWARE\Microsoft\Transaction Server\Setup(OCM)
HKLM\SYSTEM\CurrentControlSet\Control\Print\Forms\B5 (ISO)
HKCR\Installer\Assemblies\C:|Program Files (x86)|Microsoft Help Viewer|v2.1|HlpViewer.exe
HKLM\SYSTEM\CurrentControlSet\Services\EventLog\Application\Intel(R) ME Application
HKLM\SOFTWARE\Microsoft\Fax\Outbound Routing\Groups\<All devices>