如果启用延迟扩展,我怎样才能转义作为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
命令也不会成功。
你能帮帮我吗?
答案 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
命令的内部。