如何以安全的方式回显字符串 %I
,而不管 echo
命令行是否位于 for %I
循环?
例如,在命令提示符(cmd
)中:
>>> rem // `echo` is outside of `for` scope, so this works:
>>> echo %I
%I
>>> rem // `echo` is inside of `for` scope, so `%I` is resolved:
>>> for %I in (.) do @echo %I
.
>>> rem // escaping does not help, `%I` is still resolved:
>>> for %I in (.) do @(echo ^%I & echo %^I & echo ^%^I & echo %%I)
.
.
.
%.
然后在批处理文件中...:
@echo off & rem // Here you need to double the `%` signs!
rem // `echo` is outside of `for` scope, so this works:
echo %%I & echo %%%%I
echo/
rem // `echo` is inside of `for` scope, so `%%I` is resolved:
for %%I in (.) do (echo %%I & echo %%%%I)
echo/
rem // escaping does not help, `%%I` is still resolved:
for %%I in (.) do (echo ^%%I & echo %%^I & echo ^%%^I & echo ^%^%I & echo ^%^%^I & echo ^%%^%%^I)
...结果是:
%I %%I . %. . . . I ^I %.
那么我该如何更改上述方法(cmd
和批处理文件)才能得到 %I
回显?
最佳答案
有两种方法可以解决 for
引用 %I
的意外扩展:
延迟扩张
在 cmd
中:
>>> rem // Ensure that delayed expansion is enabled!
>>> set "STR=%I"
>>> echo !STR!
%I
>>> for %I in (.) do @echo !STR!
%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
...结果:
%I %I %%I %%I
但是,延迟扩展在某些情况下可能会造成伤害; setlocal
/endlocal
也可以实现环境本地化。
不过还有一个办法:
围绕另一个 for
循环
在 cmd
中:
>>> for %J in (%I) do @echo %J
%I
>>> for %J in (%I) do @for %I in (.) do @echo %J
%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
)
...结果:
%I %I %%I %%I
当然,虽然你现在不能再回显 %%J
了。
围绕另一个 for
循环(根据 dbenham 的 suggestion 编辑)
在 cmd
中:
>>> 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 (%%) do (
echo %%JI
for %%I in (.) do echo %%JI
)
for %%J in (%%%%) do (
echo %%JI
for %%I in (.) do echo %%JI
)
...结果:
%I %I %%I %%I
这次连 %%J
都可以回显了。
关于windows - 如何安全地回显文字字符串 "%I"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41365237/