2014-10-30 193 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

相關問題