如何使用 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
命令的内部完成的。
在启用延迟扩展的情况下,如何转义作为 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
命令的内部完成的。