为什么FOR命令的语法不正确?

问题描述 投票:0回答:1

我使用

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%"

任何人都可以帮我解决这个语法错误的原因吗?

windows batch-file for-loop
1个回答
1
投票

打开 命令提示符,运行

for /?
并阅读输出帮助。
do
必须与集合的结束
)
对齐,并且要执行的命令块的
(
必须与关键字
do
位于同一行,否则 Windows 命令处理器将退出批处理文件处理并显示错误消息:

命令语法不正确。

然后运行

set /?
并再次阅读输出帮助,特别是关于 IFFOR 示例中解释的关于 延迟扩展 的章节。
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 /?
    
    
© www.soinside.com 2019 - 2024. All rights reserved.