为什么子字符串不能与命令行参数一起使用?

Why don't substrings work with command line arguments?

在 Windows 批处理文件中,以下将用于提取除最后 4 个字符之外的所有 %1

set foo=%1
set x=%foo:~,-4%

但这行不通:

set x=%1:~,-4%

这是为什么?

Windows 命令处理器 cmd.exe 仅支持 environment 变量(以及 dynamic 变量的字符串替换),但不适用于批处理文件 arguments(或 loop 变量)。

foo 是一个环境变量,其值通过使用 %foo% 立即扩展和使用 !foo! 延迟扩展来引用。正如 运行 set /?command prompt window 上的帮助输出所述,环境变量支持字符串替换。 Windows 命令处理器 cmd.exe 支持对 environment(和 dynamic)变量扩展的字符串替换。

有关详细信息,请参阅 How does the Windows Command Interpreter (CMD.EXE) parse scripts?

有关环境变量和动态变量之间差异的解释,请阅读 上的长答案。

%1 引用传递给批处理文件的 参数 。命令提示符 window 中 运行 call /? 的帮助输出解释了如何在批处理文件中引用参数以及 Windows 命令处理器支持哪些修饰符。在 参数 字符串上 cmd.exe 不支持字符串替换。

为了完整起见,运行 for /? 上的帮助输出解释了如何在循环体内引用 loop 变量以及哪些修饰符可用(与参数引用相同)。 loop 变量不支持字符串替换。