Параметр пакетного файла с пробелами, двойными кавычками, каналами
У меня есть командный файл, который должен быть передан параметр, который будет включать в себя трубы и пробелы. Из-за пробелов к параметру при его передаче необходимо добавить двойные кавычки. Мне нужно удалить эти двойные кавычки и повторить параметр. Обычно использование ~ позволило бы мне сделать это, но я думаю, что что-то о конкретных параметрах, которые я передаю, вызывает проблему. Если я сделаю это:
[Test1.bat]
call test2.bat "Account|Access Level|Description"
[Test2.bat]
echo %1
echo %~1
И запустить test1.bat, я получаю этот вывод:
"Account|Access Level|Description"
'Access' is not recognized as an internal or external command, operable program or batch file.
Итак, как мне удалить двойные кавычки и при этом иметь переменную, которую можно использовать?
2 ответа
Вы можете использовать отложенное расширение, потому что оно не заботится о специальных символах.
Единственная проблема состоит в том, чтобы получить содержимое параметра в переменную, так как он может передаваться только через процентное расширение.
Но в вашем случае это должно работать.
@echo off
setlocal DisableDelayedExpansion
set "str=%~1"
setlocal EnableDelayedExpansion
echo !str!
Замечание, я отключаю сначала отложенное расширение, так что! и ^ не изменяются расширением%1
РЕДАКТИРОВАТЬ: отложенное расширение может быть отключено или включено с помощью
setlocal DisableDelayedExpansion
setlocal EnableDelayedExpansion
Если включено, добавляется еще один способ расширения переменных (!variable!
вместо %variable%
), основной для предотвращения влияния переменных в скобках (описано в set /?
).
Но расширение с !variable!
также предотвращает содержание любого дальнейшего анализа, потому что отложенное расширение является последней фазой синтаксического анализа строки линии.
Подробно объясняется, как интерпретатор команд Windows использует сценарии синтаксического анализа exe
@echo off
if "%~2"=="" (
call %0 "Account|Access Level|Description" dummy
) ELSE (
setlocal ENABLEEXTENSIONS
for /F "tokens=*" %%A IN ("%~1") DO @echo.%%A
)
Не совсем красиво, но это работает. Работа со специальными символами - это всегда боль в пакетных файлах...