2014-10-30 131 views
0

我不明白这个家伙。与空间批处理文件参数

有一个.exe,它可以将所有参数写入控制台。

>my.exe "1 2" "3 4" 
param[0]=my.exe 
param[1]=1 2 
param[2]=3 4 

有一个.bat文件

set EXE="my.exe" 
set A=%~dp1 
set B=%~n1.pre.xml 

echo 1=%1 
echo EXE=%EXE% 
echo A=%A% 
echo B=%B% 

"%EXE%" -p %A% -o %B% 

运行bat文件,输出:

1="C:\Users\xx yy\AppData\Roaming\aaaa\p_27." 
EXE="my.exe" 
A=C:\Users\xx yy\AppData\Roaming\aaaa\ 
B=p_27.pre.xml 

param[0]=my.exe 
param[1]=-p 
param[2]=C:\Users\xx 
param[3]=yy\AppData\Roaming\aaaa\ 
param[4]=-o 
param[5]=p_27.pre.xml 

好了,所以它在空间分割的路径。我想要什么,而不是分道扬!!操作简单,只需使用引号:

"%EXE%" -p %A% -o %B% 
---> 
"%EXE%" -p "%A%" -o %B% 

但输出是灾难性的:

1="C:\Users\xx yy\AppData\Roaming\aaaa\p_27." 
EXE="my.exe" 
A=C:\Users\xx yy\AppData\Roaming\aaaa\ 
B=p_27.pre.xml 

param[0]=my.exe 
param[1]=-p 
param[2]=C:\Users\xx yy\AppData\Roaming\aaa" -o p_27.pre.xml 

??????到底是怎么回事? 只有关闭报价被添加到第二个参数,其余的参数合并到第二个参数?

我怎样才能得到这样的输出:

param[0]=my.exe 
param[1]=-p 
param[2]=C:\Users\xx yy\AppData\Roaming\aaaa\ 
param[3]=-o 
param[4]=p_27.pre.xml 

回答

0

问题是以反斜杠结尾的路径。

当你调用.exe文件,你的论点是正确但从批点报价,但可执行将获取完整的命令行,并使用它自己的解析器(标准C解析器通常使用)跟随rules不同从那些批处理文件。

这个解析器会看到\"为逃脱报价,所以,你的情况,这是不包含在继续,直至下报价或的结束,第二个参数的第二个参数的结束,但报价命令行。

"my.exe" -p "C:\Users\xx yy\AppData\Roaming\aaaa\" -o p_27.pre.xml 
^0  ^1 ^2         ^escaped   ^end of 2nd arg 

要使其工作取出结束反斜杠或者,如果它不能被删除,加倍\\"。这样,解析器将在结束引号前看到一个转义反斜杠。

+0

Woaw,从来没有想过在命令行参数上应用printf样式解析器!我刚刚更改了“%EXE%”-p“%A%”-o%B% - >“%EXE%”-p“%A%\”-o%B%',就是这样 – Zotyi 2014-10-30 16:56:41

0
set "EXE=my.exe" 
set "A=%~dp1" 
set "B=%~n1.pre.xml" 

echo 1=%1 
echo EXE=%EXE% 
echo A=%A% 
echo B=%B% 

"%EXE%" -p "%A%" -o "%B%" 

1 = “C:\用户\ XX YY \应用程序数据\漫游\ AAAA \ p_27。”
EXE = my.exe
A = C:\用户\ XX YY \应用程序数据\漫游\ AAAA \
B = p_27.pre.xml

“my.exe” -p“ C:\ Users \ xx yy \ AppData \ Roaming \ aaaa \“-o”p_27.pre.xml“

+0

结果与我的报价相同:只有结束报价被添加到第二个参数,并且其余的参数被合并到第二个参数。 – Zotyi 2014-10-30 15:45:47

相关问题