windows - 如何安全地回显文字字符串 "%I"?

标签 windows batch-file for-loop cmd

如何以安全的方式回显字符串 %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 循环(根据 dbenhamsuggestion 编辑)

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/

相关文章:

c - 为什么我的 strlen 似乎在这个 for 循环中返回两个值?

windows - 根据值比较两个 COM 接口(interface)实例

python - 编写批处理脚本的最佳方法是什么?

java - Windows操作系统,如何应用屏幕反射(reflect)为x?

r - 尝试同时对不同的列数求和

python - 从 python 中的字典列表中选择一个字段

python - pip在windows中安装密码学

c# - 如何在win API的creatnamedpipe方法中为非管理员权限帐户添加安全属性

python - win32api.dll 将无法安装

Windows 批处理 SET inside IF 不工作