Параметр пакетного файла с пробелами, двойными кавычками, каналами

У меня есть командный файл, который должен быть передан параметр, который будет включать в себя трубы и пробелы. Из-за пробелов к параметру при его передаче необходимо добавить двойные кавычки. Мне нужно удалить эти двойные кавычки и повторить параметр. Обычно использование ~ позволило бы мне сделать это, но я думаю, что что-то о конкретных параметрах, которые я передаю, вызывает проблему. Если я сделаю это:

[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
)

Не совсем красиво, но это работает. Работа со специальными символами - это всегда боль в пакетных файлах...

Другие вопросы по тегам