For loop 如何从';命令';用于/F?

For loop 如何从';命令';用于/F?,for-loop,cmd,escaping,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 或 要分别返回条或条? 不幸的是,它被扩展为!福或“!FOO!” 当使用即时扩展(意思是%FOO%或%FOO%“)时,我得到了我想要的 我试着使用^,^^,,…,还与“usebackq”选项

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

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

要分别返回
? 不幸的是,它被扩展为
!福
“!FOO!”

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

我试着使用
^
^^
,…,还与“usebackq”选项(
`echo`
)一起使用,但没有成功。 即使在第一个
echo
之前使用
call
命令也不会成功

您能帮助我吗?

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

所以,真正的问题是
!福cmd
配置),代码>被解析为文本

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

set "FOO=bar"
cmd /v /c"for /F %L in ('echo !FOO!') do echo %L"
请注意,
的扩展!福
变量是在
cmd/v/c
实例中执行的,而不是在开始执行
echo
命令的
cmd
实例中执行的。

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

所以,真正的问题是
!福cmd
配置),代码>被解析为文本

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

set "FOO=bar"
cmd /v /c"for /F %L in ('echo !FOO!') do echo %L"
请注意,
的扩展!福
变量是在
cmd/v/c
实例中执行的,而不是在开始执行
echo
命令的
cmd
实例中执行的。

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

所以,真正的问题是
!福cmd
配置),代码>被解析为文本

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

set "FOO=bar"
cmd /v /c"for /F %L in ('echo !FOO!') do echo %L"
请注意,
的扩展!福
变量是在
cmd/v/c
实例中执行的,而不是在开始执行
echo
命令的
cmd
实例中执行的。

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

所以,真正的问题是
!福cmd
配置),代码>被解析为文本

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

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


请注意,
的扩展!福
变量在
cmd/v/c
实例中执行,而不是在
cmd
实例中执行
echo
命令。

是的,我在命令解释器中运行它;感谢您提供有关
SETLOCAL
的提示!我刚刚发现它也适用于第一个
echo
,前面是
cmd/V/C
部分。variant
cmd/V/C*
使命令解释器在观看echos时执行命令
echo条
;但是,在('echo^^!FOO^^')中为/F%L键入
cmd/V/Cdo echo%L
执行
echo!FOO!
,因此扩展会在以后进行。@aschipfl或多或少地在同一个cmd实例中进行,但不是在创建新的
cmd
实例以执行内部
echo
之前扩展变量,而是在执行
echo%L
时进行扩展d、 这将被解析并转换为
echo!FOO!
,然后,当启用延迟扩展时,变量的内容将被回显。我理解,因此内部
echo
按字面意思输出
!FOO!
,在用它替换
%L
之后,由最后一个
echo
扩展到
条is可能非常有用,因为即使在
for
语句的主体(
do()
)中也可以修改变量
FOO
。因此,
(set FOO=BAR)&cmd/V/C“for/F%L in('echo^!FOO^^!)do((set FOO=MOD)&echo.%L)“
结果为
MOD
,但为
^!”替换为
,返回初始字符串
。@aschipfl,是的,在
中!福案例解析
for
命令时完成扩展。在
^^中!福^^ ^案例执行外部
echo
时完成扩展。是的,我在命令解释器中运行它;感谢您提供有关
SETLOCAL
的提示!我刚刚发现它也适用于第一个
echo
,前面是
cmd/V/C
部分。variant
cmd/V/C*
使命令解释器在观看echos时执行命令
echo条
;但是,在('echo^!FOO^^^')do echo%L中为/F%L键入
cmd/V/C“将执行
echo!FOO!
,因此扩展甚至会在以后进行。@aschipfl,或多或少,