【问题标题】:cmd batch variable behavior is unintuitivecmd 批处理变量行为不直观
【发布时间】:2020-09-23 19:30:52
【问题描述】:

我使用的是 Windows 10,通过命令提示符窗口运行批处理文件。

我可以让事情发挥作用,但我不知道为什么它会起作用,或者为什么我不能做某些事情:

set "file_list=a1 a2"
for %%a in (%file_list%) do (
    echo %%a.py
)

这小段代码有效。我可以建立在它之上,但是

Q1:我想将变量 %%a 更改为 %%filename...但这不起作用!我想知道是否可能保留了文件名,所以我尝试了 %%fname 。 在这种情况下,我得到了错误:

%fname was unexpected at this time.

我可以从命令行进行设置并使用描述性变量名称,但在循环时它似乎不起作用。 (我是用上面的 %file_list% 变量做到的!)那么为什么我只能对循环变量使用单个字符呢?有什么办法吗?

Q1a。这让我认为循环索引变量与 set 命令中的变量是不同类型的变量。那是对的吗?如果是这样,是否有一个链接可以清楚简洁地解释差异?

第二季度。我注意到循环索引变量是 %%a,而不是 a 或 %a 或 %a% 。我永远不会猜到这一点。我看过的网站刚刚说,这样做。但我看不出任何解释为什么,除了第一个百分比是逃避。好的。这并不能解释什么。它只是意味着“这就是你的做法”。我使用百分号时的错误信息很有趣。

set "file_list=a1 a2"
for %a in (%file_list%) do (
    echo %a.py
)

"file_list) was unexpected at this time."

所以我可以隐约看到,也许某些东西没有被正确转义。为什么 %a 中的那个 % 需要转义,所以变成了 %%a ?

【问题讨论】:

  • for 命令的帮助信息顶部附近,(在命令提示符处使用for /?help for,您应该清楚地看到像这样To use the FOR command in a batch program, specify %%variable instead of %variable.
  • IBM 的一位女工程师做出了这些决定。原因是为了运行 MSDos 批处理文件。
  • for 只接受一个字母的参数。这就是工作原理。
  • 这对 MSDos 用户来说并非不直观。 39 年的语法几乎相同。

标签: loops batch-file variables cmd


【解决方案1】:

for 元变量必须由 %(在命令提示符中)或 %%(在批处理文件中)和单个字符(区分大小写的字母)组成,例如 %a%%a .您不能定义%filename%%filename
循环变量只存在于各自的for 循环中。不要将此类循环变量与普通环境变量(例如,%TEMP%)混淆,这些变量在全局范围内可用。

%-signs标记的这些东西:

  1. %-escaping(仅适用于批处理文件),所以%% 表示一个文字%-sign;
  2. command line arguments/parameters(显然只适用于批处理文件),比如%1
  3. 立即展开environment variables*,如%TEMP%
  4. for meta-variables,如%a(在命令提示符中)或%%a(在批处理文件中),它们特定于for 命令,因此它们不存在于相关循环上下文之外;

%-escaping (1.) 发生在扩展元变量 (4.) 之前,因此实际上 for 命令接收一个循环变量,如 %a
然后环境变量 (3.) 在命令提示符和批处理文件中的处理方式不同:前者按字面意思保留未定义的变量,后者将其删除。
详细的解析规则可以在this post中找到,微软(或者IBM?)都是这样实现的,以便能够区分不同的%-things,所以最后是他们的决定,因此,您必须询问他们的确切原因……


*) 也有类似delayed environment variable expansion的东西,但是这使用!-signs来标记变量,例如!TEMP!,这是在所有%-sign表达式之后发生的事情已被解析。

【讨论】:

    猜你喜欢
    • 2017-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    相关资源
    最近更新 更多