Выход из амперсандов в пакетных файлах Windows - PullRequest
6 голосов
/ 03 ноября 2010

Я понимаю, что вы можете экранировать амперсанды в пакетных файлах, используя символ шляпы

, например

echo a ^& b
a & b

Но я использую команду

for /f "tokens=*" %%A IN ('DIR /B /A-D /S .acl') DO ProcessACL.cmd "%%A"

, который находит все файлы с именем '.acl' в текущем каталоге или подкаталоге текущего каталога.

Проблема в том, что я нахожу имена путей, которые включают символ '&' (и нет, они не могут быть переименованы), и мне нужен способ автоматического выхода из амперсандов и вызова второго пакетного файла с экранированный путь в качестве параметра.

rem ProcessACL.cmd
echo %1

Ответы [ 2 ]

7 голосов
/ 04 ноября 2010

Проблема не в том, чтобы убежать, похоже, что во втором сценарии.

Если есть строка, подобная

echo %1

, то она расширяется и дает сбой:

echo You & me.acl

Лучше использовать отложенное расширение, например

setlocal EnableDelayedExpansion
set "var=%~1"
echo !var!

Чтобы избежать также проблем с восклицательными знаками ! в параметре, первый set должен использоваться в контексте DisabledDelayedExpansion.

set "var=%~1"
setlocal EnableDelayedExpansion
echo !var!
0 голосов
/ 03 ноября 2010

Ваша строка должна быть (обратите внимание на * .acl)

for /f "tokens=*" %%A IN ('DIR /B /A-D /S *.acl') DO ProcessACL.cmd "%%A"

ProcessACL.cmd может получить доступ к пути, переданному ему с% 1.

// ProcessACL.cmd
ECHO %1

Все, что содержится в переменной% 1, полностью содержится. Нет необходимости в побегах. Экраны предназначены для пакетного процессора для интерпретации символов, которые он анализирует.

...