如何使用 FOR /F 从 'command' 中转义感叹号?

How to escape exclamation mark from 'command' using FOR /F?

在启用延迟扩展的情况下,如何转义作为 FOR /F 命令参数声明的命令内的感叹号,例如

set FOO=BAR
setlocal enabledelayedexpansion
rem non-quoted variable
for /F %L in ('echo !FOO!') do echo %L
endlocal

set FOO=BAR
setlocal enabledelayedexpansion
rem quoted variable
for /F %L in ('echo "!FOO!"') do echo %L
endlocal

分别返回BAR"BAR"? 不幸的是,它被扩展为 !FOO!"!FOO!"

当使用立即扩展时(意思是 %FOO%"%FOO%")我得到了我想要的。

我尝试使用 ^!^^!!!、...,还与 "usebackq" 选项 (`echo`) 一起使用,但是没有成功。 即使在第一个 echo 之前加上 call 命令也不会成功。

你能帮帮我吗?

从使用的语法 (%L) 来看,您在命令行中 运行 它,并且从这个上下文来看,命令 setlocal enabledelayedexpansion 无效。如果您阅读 setlocal /?,您会看到此命令用于批处理文件。

因此,真正的问题是 !FOO! 被解析为文字,因为延迟扩展未激活(默认 cmd 配置)。

如何从命令行执行?为 cmd 实例启用延迟扩展

set "FOO=bar"
cmd /v /c"for /F %L in ('echo !FOO!') do echo %L"

注意!FOO!变量的扩展是在cmd /v /c实例内部完成的,而不是在cmd实例开始执行echo命令的内部完成的。