Как передать параметр, заканчивающийся на "!" в другой файл bat?
У меня есть два файла bat, и мне нужно передать три параметра из одного файла bat в другой. Однако, если параметр заканчивается на "!" параметр не получен
caller.bat
impl.bat param1 param2! param3
impl.bat
echo %1
echo %2
echo %3
Ожидаемый результат после запуска caller.bat:
param1
param2!
param3
Фактический результат после запуска caller.bat:
param1
param2
param3
Может кто-нибудь помочь, как я могу достичь фактического результата?
3 ответа
Фактически, метка объяснения принимается целевым пакетным файлом, но отбрасывается при обработке команды echo. Это можно увидеть, если включить эхо. (Однако, если вы используете call
команда для запуска командного файла, метка объяснения ему не передается.)
Знак объяснения сбрасывается только в том случае, если включено отложенное расширение. Вы можете исправить это, временно отключив отложенное расширение:
setlocal disabledelayedexpansion
impl.bat param1 param2! param3
Вы также можете обойти это, заключив в кавычки специальный символ с помощью каретки, хотя, поскольку аргумент проходит несколько уровней обработки, вы должны заключать его в кавычки несколько раз:
impl.bat param1 param2^^^^^! param3
или же
call impl.bat param1 param2^^^^^^^^^^! param3
Этот подход может быть ненадежным, поскольку он зависит от того, что ребенок делает с аргументом. Предпочтительно отключить отложенное расширение, хотя это не сработает, если ребенок снова включит его.
Как и в других ответах, можно отключить отложенное расширение, но не обязательно отображать восклицательный знак.
Важно, чтобы вы поместили восклицательный знак (и другие специальные символы) в переменную.
Тогда вы можете использовать его с задержкой расширения
Образец
@echo off
set "param1=%~1"
set "param2=%~2"
setlocal EnableDelayedExpansion
echo Works: !param1! !param2!
echo FAILS: %param1% %param2%
Вызов это с
myBatch.bat arg1! "arg2!<>&"
Преимущество отложенного расширения заключается в том, что любой контент может обрабатываться без побочных эффектов, поскольку расширенный контент больше не будет анализироваться.
Процентное расширение во многих случаях завершится неудачно, так как содержимое будет проанализировано также для специальных символов.
Один из немногих случаев, когда решением является отключение отложенного расширения. Я предполагаю, что вы включаете его либо при запуске вашего cmd.exe
или как setlocal
строка в вашем командном файле. В любом случае, самый короткий ответ - перестать включать это - по умолчанию параметры cmd делают именно то, что вы хотите.
Если вы полагаетесь на отложенное расширение в другом месте и не можете отключить его глобально, тогда вы можете использовать setlocal
отключить его для куска кода.
echo %1
setlocal disabledelayedexpansion
echo %2
endlocal
echo %3
Просто отметьте, что где бы вы ни раскрыли переменную с символом взрыва, отложенное расширение должно быть отключено. Это включает в себя, если вы установите его в переменной и использовать эту переменную позже.