Windows 如何安全地回显文本字符串";%我;?

Windows 如何安全地回显文本字符串";%我;?,windows,batch-file,for-loop,cmd,Windows,Batch File,For Loop,Cmd,如何以安全的方式回显字符串%I,而不依赖于echo命令行是否位于%I循环的中 例如,在命令提示符(cmd)中: >>rem/`echo`不在`for`范围内,因此它可以: >>>回显%I %我 >>>rem/`echo`在`for`范围内,因此解析了`I`: >>>对于(.)中的%I,执行@echo%I . >>>rem//转义没有帮助,`%I`仍然被解析: >>>对于(.)中的%I执行@(echo^%I&echo%^I&echo^%^I&echo%%I) . . . %. 在批处理文件中…:

如何以安全的方式回显字符串
%I
,而不依赖于
echo
命令行是否位于%I循环的

例如,在命令提示符(
cmd
)中:

>>rem/`echo`不在`for`范围内,因此它可以:
>>>回显%I
%我
>>>rem/`echo`在`for`范围内,因此解析了`I`:
>>>对于(.)中的%I,执行@echo%I
.
>>>rem//转义没有帮助,`%I`仍然被解析:
>>>对于(.)中的%I执行@(echo^%I&echo%^I&echo^%^I&echo%%I)
.
.
.
%.
在批处理文件中…:

@echo off & rem // Here you need to double the `%` signs!
setlocal EnableDelayedExpansion
set "STR=%%I"
echo !STR!
for %%I in (.) do echo !STR!

set "STR=%%%%I"
echo !STR!
for %%I in (.) do echo !STR!
endlocal
@echo off&rem//这里您需要将“%”符号加倍!
rem/`echo`不在`for`范围内,因此它可以:
echo%%I和echo%%%I
回音/
rem/`echo`位于`for`范围内,因此解析了`%%I`:
对于(.)do中的%%I(echo%%I和echo%%%I)
回音/
rem//转义没有帮助,`%%I`仍然被解析:
对于(.)中的%%I,执行(echo^%%I&echo%%^I&echo^%%^I&echo^%%^%I&echo^%%^%%^I&echo^%%^%%^I)
…结果是:

%I
%%我
.
%.
.
.
.
我
^我
%.

因此,我必须如何更改上述方法(包括
cmd
和批处理文件)以获得
%I
回音?

有两种方法可以解决
参考
%I
的非预期扩展问题:

延迟扩张 在
cmd
中:

>>> rem // Ensure that delayed expansion is enabled!

>>> set "STR=%I"

>>> echo !STR!
%I

>>> for %I in (.) do @echo !STR!
%I
>>> for %J in (%I) do @echo %J
%I

>>> for %J in (%I) do @for %I in (.) do @echo %J
%I
>>> for %J in (%) do @echo %JI
%I

>>> for %J in (%) do @for %I in (.) do @echo %JI
%I
在批处理文件中…:

@echo off & rem // Here you need to double the `%` signs!
setlocal EnableDelayedExpansion
set "STR=%%I"
echo !STR!
for %%I in (.) do echo !STR!

set "STR=%%%%I"
echo !STR!
for %%I in (.) do echo !STR!
endlocal
…结果是:

但是,在某些情况下,延迟扩张可能会造成伤害;通过
setlocal
/
endlocal
可以实现环境定位

但还有另一种方法:

环绕另一个
循环
在
cmd
中:

>>> rem // Ensure that delayed expansion is enabled!

>>> set "STR=%I"

>>> echo !STR!
%I

>>> for %I in (.) do @echo !STR!
%I
>>> for %J in (%I) do @echo %J
%I

>>> for %J in (%I) do @for %I in (.) do @echo %J
%I
>>> for %J in (%) do @echo %JI
%I

>>> for %J in (%) do @for %I in (.) do @echo %JI
%I
在批处理文件中…:

@echo off & rem // Here you need to double the `%` signs!
for %%J in (%%I) do (
    echo %%J
    for %%I in (.) do echo %%J
)
for %%J in (%%%%I) do (
    echo %%J
    for %%I in (.) do echo %%J
)
@echo off & rem // Here you need to double the `%` signs!
for %%J in (%%) do (
    echo %%JI
    for %%I in (.) do echo %%JI
)
for %%J in (%%%%) do (
    echo %%JI
    for %%I in (.) do echo %%JI
)
…结果是:

当然,尽管您现在不能再回显
%%J

环绕另一个
循环(根据的编辑)
在
cmd
中:

>>> rem // Ensure that delayed expansion is enabled!

>>> set "STR=%I"

>>> echo !STR!
%I

>>> for %I in (.) do @echo !STR!
%I
>>> for %J in (%I) do @echo %J
%I

>>> for %J in (%I) do @for %I in (.) do @echo %J
%I
>>> for %J in (%) do @echo %JI
%I

>>> for %J in (%) do @for %I in (.) do @echo %JI
%I
在批处理文件中…:

@echo off & rem // Here you need to double the `%` signs!
for %%J in (%%I) do (
    echo %%J
    for %%I in (.) do echo %%J
)
for %%J in (%%%%I) do (
    echo %%J
    for %%I in (.) do echo %%J
)
@echo off & rem // Here you need to double the `%` signs!
for %%J in (%%) do (
    echo %%JI
    for %%I in (.) do echo %%JI
)
for %%J in (%%%%) do (
    echo %%JI
    for %%I in (.) do echo %%JI
)
…结果是:


这一次,甚至
%%J
都可以得到回应。

+1,但我建议将
%J
定义为单个
%%
,没有字母。然后
%J
可以在需要
%
文本的任何地方使用。好主意,@dbenham,这肯定更灵活!如果你愿意,你也可以提供你自己的答案……这是一个有趣的问答,但这不是一个人为制造的问题吗?当然,最简单的解决方案是避免为“for”循环选择同一个字母——您还有25个其他字母要选择(加上所有26个相反大小写),那么为什么要选择唯一一个给您带来问题的字母呢?@KlitosKyriacou,当然这是一个构造问题,但我发现解决这个问题很有趣,我想与大家分享。实际上,我在尝试这样的操作时遇到了这样不必要的
%I
扩展:
在(.)do@(设置“ITEM=%I”&调用echo^%ITEM^%)
(返回
.TEM%
,因为
^%ITEM^%
中的
%I
已扩展)。。。