我使用
reg query
编写了一个批处理文件。批处理文件中有一个 for
循环。命令语法不正确。
这是中文,意思是:
命令语法不正确。
产生此错误的批处理文件是:
@echo off
for /F "tokens=1,2 delims=:" %%a in ('reg query "HKEY_CURRENT_USER\Software\WinRAR SFX" /v "C%%Program Files (x86)%Cloud Tool Service"')
do
(
set "value1=%%a"
echo %value1%
set "value2=%%b"
echo %value2%
)
set "install_dir=%value1:~-1%:%value2%"
任何人都可以帮我解决这个语法错误的原因吗?
打开 命令提示符,运行
for /?
并阅读输出帮助。 do
必须与集合的结束 )
对齐,并且要执行的命令块的 (
必须与关键字 do
位于同一行,否则 Windows 命令处理器将退出批处理文件处理并显示错误消息:
命令语法不正确。
然后运行
set /?
并再次阅读输出帮助,特别是关于 IF 和 FOR 示例中解释的关于 延迟扩展 的章节。 echo %value1%
总是会导致仅执行 echo
打印回显模式的当前状态,除非环境变量 value1
已经在 执行 for
之前偶然定义。
Windows 命令处理器将整个命令块从
(
解析为匹配的 )
,并在执行命令 %variable%
之前将所有 for
替换为引用的环境变量 之前的当前值。这可以在调试批处理文件中看到。 另请参阅:
Windows 命令解释器 (CMD.EXE) 如何解析脚本?
最后要查询名称为C%%Program Files (x86)%Cloud Tool Service
的注册表字符串值,确实按照WinRAR 在当前用户的 Windows 注册表配置单元中所写的那样存储,有必要使用一个百分号来转义批处理文件中的每个百分号。 即使在 Windows XP 上也能进行错误检查的批处理文件代码是:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "InstallDirectory="
for /F "skip=2 eol=H tokens=1-6*" %%I in ('%SystemRoot%\System32\reg.exe query "HKEY_CURRENT_USER\Software\WinRAR SFX" /v "C%%%%Program Files (x86)%%Cloud Tool Service" 2^>nul') do (
if /I "%%I %%J %%K %%L %%M" == "C%%%%Program Files (x86)%%Cloud Tool Service" (
if "%%N" == "REG_SZ" (
set "InstallDirectory=%%O"
) else if "%%N" == "REG_EXPAND_SZ" (
call set "InstallDirectory=%%O"
)
if defined InstallDirectory goto CheckDirectory
)
)
echo Could not find installation directory of Cloud Tool Service in registry.
goto EndBatch
:CheckDirectory
rem Remove backslash at end of installation directory if there is one at all.
if "%InstallDirectory:~-1%" == "\" set "InstallDirectory=%InstallDirectory:~0,-1%"
if exist "%InstallDirectory%\" (
echo Cloud Tool Service installed in: "%InstallDirectory%"
) else (
echo Cloud Tool Service directory "%InstallDirectory%" does not exist.
)
:EndBatch
rem Restore initial environment which results in discarding the environment
rem variable InstallDirectory as defined by the code above on directory found
rem in Windows registry of current user account.
endlocal
要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。
call /?
echo /?
endlocal /?
for /?
goto /?
if /?
reg /?
和
reg query /?
rem /?
set /?
setlocal /?