我在Windows 7上运行批处理文件并遇到此错误(我已将错误范围缩小到以下行):
FOR /F "delims=" %%I in ('echo %RegVal%') do set sasroot=%%~sI
其中Regval是给定软件的文件路径,在这种情况下(在我的Win7机器上)是:
RegVal = C:\Program Files\SAS 9.2_M3_10w37\SASFoundation\9.2(32-bit)
这个相同的脚本曾经在Windows Vista上运行,虽然我怀疑它现在可能是RegVal中有一个括号,因为它在我以前的Vista机器上是C :\Program Files\SAS 9.2_M3_10w37\SASFoundation\
。
答案 0 :(得分:2)
你怀疑是正确的。
要绕过它,请将变量括在双引号中(使用~
命令中的set
再次删除它们)
FOR /F "delims=" %%I in ('echo "%RegVal%"') do set sasroot=%%~sI
答案 1 :(得分:0)
我建议你在其中创建一个值为RegVal
的文件,然后使用FOR
循环解析它:
echo %RegVal%>C:\SomeFile.txt
FOR /F "delims=" %%I in (C:\SomeFile.txt) do set sasroot=%%~sI
这可以帮助您解决问题。
斯蒂芬的解决方案要简单得多,但无论如何我都会解释我的解决方案,这在某些情况下可能会有用。
当FOR
命令使用命令解析IN
部分中指定的数据时,它会将命令替换为命令的结果,然后运行FOR
命令。例如,通过上述问题,展开FOR
后将执行的echo %RegVal%
命令为:
FOR /F "delims=" %%I in (C:\Program Files\SAS 9.2_M3_10w37\SASFoundation\9.2(32-bit)) do set sasroot=%%~sI
因此,当解析器命中第一个右括号时,它将停止,认为之前读过的所有内容都是要处理的文本。但是,在这种情况下这是错误的,因为第一个右括号是要读取的字符串的一部分;它没有表明字符串的结尾。
使用FOR
命令解析文件时,它将读取每一行,为预定义的令牌分配正确的值,然后执行后面的代码块。冲洗并重复文件中的每一行。但在这种情况下,它不会用每一行替换IN
部分;它只会解析它并为标记赋值。这就是特殊字符(例如括号)在这种情况下不会创建解析错误的原因。