为什么子字符串不能与命令行参数一起使用?
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 变量不支持字符串替换。
在 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 变量不支持字符串替换。