带空格的批处理文件参数

时间:2014-10-30 14:45:47

标签: batch-file parameters

我不明白这些人。

有一个.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

2 个答案:

答案 0 :(得分: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:\ Users \ xx yy \ AppData \ Roaming \ aaaa \ p_27。”   
  EXE = my.exe   
  A = C:\ Users \ xx yy \ AppData \ Roaming \ aaaa \   
  B = p_27.pre.xml   
  
  “my.exe”-p“C:\ Users \ xx yy \ AppData \ Roaming \ aaaa \” - o“p_27.pre.xml”

答案 1 :(得分: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

要使其正常工作,请删除结尾反斜杠,如果无法删除则将其加倍\\"。这样,解析器将在结束引用之前看到转义的反斜杠。