2011-01-26 1 views
3

Я столкнулся с проблемой при передаче аргумента, который заканчивается символом = sign для пакетных файлов. Рассмотрим (>, как приглашение для Windows XP):Передача '=' в аргументах оконным пакетным файлам

> type c.bat 
echo %1 

> c.bat bla= 
bla 

> c.bat "bla=" 
"bla=" 

Почему = в bla= проглотила? И как я должен передать знак = в аргументе?

ответ

7

Это известная проблема: http://support.microsoft.com/kb/35938

Вы можете обойти это следующим образом:

SET ARG1=bla= && your.bat && SET ARG1= 

и your.bat:

@ECHO OFF 
ECHO %ARG1% 

В качестве альтернативы вы можете передать его в качестве параметра в кавычках (с использованием «вокруг»):

your.bat "bla=" 

, а затем использовать его в пакетном файле следующим образом:

echo %~1 

~ есть в этом случае просто снимает кавычки.

+1

«unquoting» с помощью '% ~ 1 'является ключом, и если вы хотите что-то передать в вашей функции с помощью' вызова: my_function_label «% my_var_with_ugly_chars» '- без кавычек вы получите первый маркер аргумент как '% 1', и с ними вам нужно удалить кавычки. –

2

Прочитайте документ:

http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/cmd.mspx?mfr=true

"Следующие специальные символы требуют кавычки: & <> [] {}^=; '+,` ~ [пробел]"

+0

Спасибо! Но это говорит о том, что есть проблемы с =, но не то, что здесь происходит (окна не жалуются, что с командой что-то не так), и как я могу передать bla =. –

+0

Вы можете передать blah =, поместив аргумент в кавычки, как в вашем последнем примере. –

+0

Не совсем - тогда я передаю «bla =» - включая кавычки - и не просто bla =, как я желаю. Но другой ответ указывает на отсутствие решения. –

0

будет ли это делать?

Если tem.cmd содержит

@echo off 
set param=%1 
set param=%param:"=% 
echo %param% 

затем

c:\> tem.cmd "hi=" 

дает

hi= 
+3

Примечание: 'echo% ~ 1' делает то же самое :-) – Joey

1

Вы можете использовать

your.bat "bla=" 

------ your.bat ---- 
echo %~1 

или также

your.bat bla= 

------ your.bat ---- 
echo %* 

Лучшее решение зависит от случая.

описание находится на

call /? 

Обычно это лучше вложить проблемные параметры в кавычки и удалить кавычки позже с модификатором %~.
set "param1=%~1" использует тот факт, что %~1 удалит закрывающие кавычки, когда они существуют.
И котировки около "param1=%~1" гарантируют, что специальные символы не будут вызывать ошибки.

call :myFunc "<Hard>=&|" 
exit /b 

:myFunc 
setlocal EnableDelayedExpansion 
set "param1=%~1" 
echo(!param1! 
exit /b 

Но с кавычками внутри параметра проблемы все еще могут возникать.

call :myFunc "&"^&"" 
+0

Большое спасибо за альтернативу'% * '- теперь для 1-аргументных« пакетных функций »я могу использовать' call: my_function_label% my_var_with_ugly_chars' и в функции обратитесь к '% *', где мне нужна функция после метки функции (это «все аргументы», например, '' '' '' '' '' '' '' s ', правильно?). –

+0

@TomaszGandor Да, но проще и безопаснее использовать 'call: myFunc '<> ~ =;" 'и расширять это с помощью' set' myVar =% ~ 1 "' – jeb