2013-02-25 87 views
3

我已阅读了不同方法获取windows批处理文件解析器以正确处理具有空格,括号和其他特殊字符的变量的许多线程,但似乎没有任何建议可以解决我遇到的问题。带空格和括号的批处理文件变量

这里是脚本(之前尝试的任何变通办法),其目标是建立发现variable01和variable02基于价值variable03值:

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%' 
    ) 
) 

... variable01的价值观和variable02并不是事先知道的 - 在运行脚本之前它们会被另一个程序替代,所以上面的脚本显示了在替换完成后变量01和变量02的一组示例值。

我得到当此脚本运行错误是:

\SomeProgram\Subfolder' was unexpected at this time. 

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

如果我把上面一行是:

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

...然后我得到这个错误:

Files was unexpected at this time. 

...这似乎表明,它试图来标记的变量01中的空格,解析器仍然不满意。

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

setlocal enableextensions enableDelayedExpansion 

...并更改%variable01%至variable01!我仍然得到同样的错误。

很显然,我不明白是什么批处理文件分析器需要满足我的要求,即variable03的值具有以下值:

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

...有什么建议?

回答

2

问题是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 
+1

感谢您的答复 - 这仍然会产生同样的错误,这可能是因为variable01还是会被在else子句的背景下展开。我想另一个选择是修改子程序,使其不需要参数,并为变量01和变量02的每个组合创建一个不同的子程序... – Hoobajoob 2013-02-25 21:18:35

+0

Are you sure?我在你的问题中得到错误代码,但我没有用我的代码得到它。我只是将上述内容复制粘贴到我的记事本中,并试图确保我没有错别字。 – 2013-02-25 21:21:17

+0

请注意'call:set3'行中的*双引号*。如果你使用单引号,你会得到错误。 – 2013-02-25 21:23:44

7

正如Nate写的,这里的问题是括号,但是完整的代码仍然不稳定。

使用延迟扩展总是更好,因为这对任何特殊字符都是安全的。
你应该使用SETset "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! 
+0

“您应该使用SET set”variable = content“的扩展语法来将完整的表达式用引号括起来,然后它几乎是安全的......”,为什么它几乎是安全的?在什么情况下会失败? – Samuel 2015-02-13 22:57:36

+1

@Samuel当内容包含引号本身时可能是不安全的,比如'set“var =她说:”Dog&Cat“给我”'但是在这种情况下,只有一条路径它应该是安全的 – jeb 2015-02-14 00:27:38

+0

Gotcha,谢谢澄清。 – Samuel 2015-02-17 16:39:33