在Windows批处理文件中转义&符号

6
我知道在批处理文件中可以使用脱字符来转义和符号,例如:
``` ^& ```
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

问题不在转义上,似乎是在第二个脚本中。

如果有像这样的一行:

echo %1

然后它会扩展并失败:
echo You & me.acl

最好使用延迟扩展,例如:
setlocal EnableDelayedExpansion
set "var=%~1"
echo !var!

为了避免参数中的感叹号!引起问题,应该在DisableDelayedExpansion上下文中使用第一个set
setlocal DisableDelayedExpansion
set "var=%~1"
setlocal EnableDelayedExpansion
echo !var!

带有“&”的文件现在可以正常工作,但带有“!”的文件不再起作用。 - ariel
@ariel 谢谢你的提示,我也添加了一个解决方案。 - jeb

0

你的for循环应该是(注意*.acl)

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

ProcessACL.cmd 可以使用 %1 访问传递给它的路径。

// ProcessACL.cmd
ECHO %1

变量 %1 包含的任何内容都已完全包含。无需进行转义。转义是为了使批处理器能够解释它正在解析的字符。

1
感谢您的回复。'.acl'特别寻找名为'.acl'的文件,而不是所有扩展名为.acl的文件。我已经在ProcessACL.cmd文件中使用了%1,并且当%1包含包含'&'符号的路径时,会产生错误“&在此时是意外的”。 - Bryan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接