使用空格和括号batch filevariables

我已经阅读了许多不同的方法来获得Windowsbatch fileparsing器正确处理variables有空格,括号和其他特殊字符,但没有任何build议似乎能够解决我所遇到的问题。

这里是脚本(在尝试任何解决方法之前),其目标是根据variables01和variables02的值设置variables03的值:

set variable01="C:\Program Files (x86)\SomeProgram\Subfolder" set variable02="${macro}" set variable01=%variable01:"=% set variable02=%variable02:"=% set variable03="" if %variable02:~0,1%==$ ( if %variable01:~0,1%==$ ( set variable03=%variable03:"=% ) else ( set variable03=-o '%variable01%' ) ) 

…variables01和variables02的值是事先不知道的 – 在运行脚本之前被另一个程序replace,所以上面的脚本显示了在replace完成之后variables01和variables02的一组值。

这个脚本运行时得到的错误是:

 \SomeProgram\Subfolder' was unexpected at this time. 

…对应于上述脚本中的最后一个“设置”行。 我认为这个错误是由于variable01的括号中的。

如果我改变这一行:

 set "variable03=-o '%variable01%'" 

…然后我得到这个错误:

 Files was unexpected at this time. 

…似乎表明它试图在variables01中的空格上进行标记,而parsing器仍然不快乐。

如果我然后在脚本的顶部添加这一行:

  setlocal enableextensions enableDelayedExpansion 

…并将%variable01%更改为!variable01!,我仍然得到相同的错误。

显然,我不明白什么batch fileparsing器需要满足我的要求,variable03的值有以下值:

 -o 'C:\Program Files (x86)\SomeProgram\Subfolder' 

…有什么build议么?

Solutions Collecting From Web of "使用空格和括号batch filevariables"

问题是variable01的值中的括号。 由于它在if条件下被扩展,所以这些括号被解释为流量控制。 总是把它放在双引号中修复。

 set variable01="C:\Program Files (x86)\SomeProgram\Subfolder" set variable02="${macro}" set variable01=%variable01:"=% set variable02=%variable02:"=% set variable03="" if "%variable02:~0,1%"=="$" ( if "%variable01:~0,1%"=="$" ( set variable03=%variable03:"=% ) else ( call :set3 "%variable01%" ) ) goto :eof REM If it is important to have single quotes instead of double then REM I found I had to call a subroutine. Otherwise the set could be REM left up in the else. :set3 set variable03=-o '%~1' goto :eof 

正如Nate所写,在这种情况下的问题是括号,但完整的代码仍然不稳定。

使用延迟扩展总是更好,因为这对任何特殊字符都是安全的。
而且你应该使用SET set "variable=content"的扩展语法来把完整的表达式用引号括起来,然后它几乎是安全的,并且引号不会被添加到内容中。
而且您不需要稍后删除引号。

这应该适用于var1和var2中的任何内容

 setlocal EnableDelayedExpansion set "variable01=C:\Program Files (x86)\SomeProgram\Subfolder" set "variable02=${macro}" set "variable03=" if "!variable02:~0,1!"=="$" ( if "!variable01:~0,1!"=="$" ( rem ) else ( set "variable03=-o '!variable01!'" ) ) echo(!variable03!