如何使用FOR / F从“命令”中删除感叹号?

时间:2015-06-25 10:06:14

标签: for-loop cmd escaping

如果启用延迟扩展,我怎样才能转义作为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命令也不会成功。

你能帮帮我吗?

1 个答案:

答案 0 :(得分:3)

从使用的语法(%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命令的内部。