Параметр пакетного файла с пробелами, двойными кавычками, каналами - PullRequest
6 голосов
/ 09 марта 2011

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

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

4 голосов
/ 09 марта 2011

Вы можете использовать отложенное расширение, потому что оно не заботится о специальных символах.
Единственная проблема - получить содержимое параметра в переменную, поскольку его можно передать только через процентное расширение.
Но в вашемВ случае, если это должно работать.

@echo off
setlocal DisableDelayedExpansion
set "str=%~1"
setlocal EnableDelayedExpansion
echo !str!

Замечание, сначала я отключаю отложенное расширение, поэтому!и ^ не изменяются расширением% 1

РЕДАКТИРОВАТЬ: Отложенное расширение можно отключить или включить с помощью

setlocal DisableDelayedExpansion
setlocal EnableDelayedExpansion

Если включено, добавляется еще односпособ расширения переменных (!variable! вместо %variable%), основной для предотвращения влияния переменных в скобках (описано в set /?).

Но расширение с помощью !variable! также предотвращает содержимоелюбой дальнейший синтаксический анализ, поскольку отложенное развертывание является последней фазой синтаксического анализа.
Подробно объясняется на , как интерпретатор команд Windows cmd exe выполняет сценарии синтаксического анализа

1 голос
/ 09 марта 2011
@echo off
if "%~2"=="" (
    call %0 "Account|Access Level|Description" dummy
) ELSE (
    setlocal ENABLEEXTENSIONS
    for /F "tokens=*" %%A IN ("%~1") DO @echo.%%A
)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...