`)`此时出乎意料。

时间:2014-06-17 18:46:10

标签: windows batch-file windows-7

我在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\

2 个答案:

答案 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部分;它只会解析它并为标记赋值。这就是特殊字符(例如括号)在这种情况下不会创建解析错误的原因。