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提出的完全有效的问题对于有类似问题的其他人可能有用,但不幸的是过早地删除了错误的结论。
(作为记录)
答案 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>