2014-10-30 6 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% 

Запуск летучей мыши файл, выход:

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 

Ok, так что разделить путь на пространстве. Я хочу, чтобы не разбить путь! Простые, просто использовать цитаты:

"%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

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 \ хх уу \ AppData \ Roaming \ аааа \ p_27."
EXE = my.exe
A = C: \ Users \ хх уу \ AppData \ Roaming \ аааа \
B = p_27.pre.xml

"my.exe" -p " C: \ Users \ хх уу \ AppData \ Roaming \ аааа \»-о "p_27.pre.xml"

+0

Тот же результат, что и мои кавычки: только вторая цитата добавляется ко второму параметру, а остальные параметры объединяются со вторым. – Zotyi

Смежные вопросы