在 Windows 批处理文件中,以下内容将提取除最后 4 个字符之外的所有 %1
:
set foo=%1
set x=%foo:~,-4%
但这行不通:
set x=%1:~,-4%
这是为什么?
最佳答案
Windows 命令处理器 cmd.exe
仅支持使用环境变量(以及动态变量)进行字符串替换,但不支持使用批处理文件进行字符串替换参数(或使用循环变量)。
foo
是一个环境变量,其值通过使用 %foo%
立即扩展和使用 !foo!
延迟扩展来引用。环境变量支持字符串替换,如 command prompt 中运行 set/?
的帮助输出所述。 window 。 Windows 命令处理器 cmd.exe
支持命令行中各处环境(和动态)变量扩展的字符串替换。
有关更多详细信息,请参阅 How does the Windows Command Interpreter (CMD.EXE) parse scripts?
有关环境变量和动态变量之间差异的解释,请阅读 Difference between Dynamic Environment Variables and Normal Environment Variables in CMD 上的长答案。 .
%1
引用传递给批处理文件的参数。在命令提示符窗口中运行 call/?
时的帮助输出解释了如何在批处理文件中引用参数以及 Windows 命令处理器支持哪些修饰符。 cmd.exe
不支持参数字符串上的字符串替换。
为了完整起见,运行 for/?
时的帮助输出解释了如何在循环体内引用循环变量以及可用的修饰符(与供参数引用)。 循环变量不支持字符串替换。
关于string - 为什么子字符串不能与命令行参数一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69449452/