2014-04-17 15 views
1

我正在研究将编译为批处理脚本(为了好玩......)的DSL。 我正在尝试进行函数调用,如下所示: DSL使用名为param1的参数定义函数。 批处理定义了param1 =%1的标签。 DSL定义了一个具有一定价值的呼叫。 批处理使用空格后的值定义一个调用。批量转义函数参数

问题是,如果该值有一个空格,则将其定义为两个参数。 我可以用^转义空格,但是如果我试图逃避双引号,它会变得混乱。

任何人都可以帮助我的最终批处理参数转义?

BTW,它与MPS编写的,它在这里,如果你想要的:https://github.com/TheAnosmic/MPSBatch

回答

0

我觉得还没有确切可靠的方法。批解析器真的很难看。例如,如果你有一个封闭的可变)以下的回声将打破:

set VAR=Program Files (x86) 
echo var=%VAR%. 

在某些情况下,它可以帮助使用FOR

@set VAR=a * b "test" c() 
@for /F " delims==" %%V in ("%VAR%") do @echo var=%%V. 

将打印

C:\Users>test.cmd 
var=a * b "test" c(). 
+0

这可能是脚本, 一个好的解决方案,但是当我在写一个“编译”,我想,它会产生更加脚本美丽。 我不在意改变它,我可以用变量编写一些逻辑,必须有一种方法来产生安全和美观的代码。 – koko0

0

最简单解决方法是使用双引号来调用你的参数。

但是,如果此参数包含一些双引号,则不起作用。在这种情况下,我们可以基于eckes的解决方案实现一个解决方案:我们可以在函数中做一个循环来读取所有参数并将它们复制到函数的参数中。

例如,这可能看起来像:

@echo off 

set var=With "" and a space 
call :call_var %var% 
goto:EOF 

:call_var 
set param= 
for /F " delims==" %%V in ("%*") do @set param=%param% %%V 
REM Test parameter 
echo %param% 
goto:EOF