在 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 /?
时的帮助输出所述。 Windows 命令处理器 cmd.exe
支持命令行中各处 environment(和 dynamic)变量扩展的字符串替换。
有关更多详细信息,请参阅Windows 命令解释器 (CMD.EXE) 如何解析脚本?
有关环境变量和动态变量之间差异的解释,请阅读CMD 中动态环境变量和普通环境变量之间的差异的长答案。
%1
引用传递到批处理文件的 argument。在命令提示符窗口中运行 call /?
时的帮助输出解释了如何在批处理文件中引用参数以及 Windows 命令处理器支持哪些修饰符。 cmd.exe
在 argument 字符串上不支持字符串替换。
为了完整起见,运行
for /?
时的帮助输出解释了如何在循环体内引用 loop 变量以及可用的修饰符(与参数引用相同)。 loop变量不支持字符串替换。