为啥子字符串不能与命令行参数一起使用?
Posted
技术标签:
【中文标题】为啥子字符串不能与命令行参数一起使用?【英文标题】:Why don't substrings work with command line arguments?为什么子字符串不能与命令行参数一起使用? 【发布时间】:2021-11-25 16:10:13 【问题描述】:在 Windows 批处理文件中,以下内容将提取除最后 4 个字符之外的所有 %1
:
set foo=%1
set x=%foo:~,-4%
但这不起作用:
set x=%1:~,-4%
这是为什么?
【问题讨论】:
它们不是同一类型的变量,%1
甚至没有与%foo%
相同的格式,这本身应该是一个赠品。顺便说一句,为了安全和可读性,它应该读作set "foo=%~1"
和set "x=%foo:~0,-4%"
。
【参考方案1】:
Windows 命令处理器cmd.exe
仅支持使用环境 变量(以及动态 变量)进行字符串替换,但不支持批处理文件参数(或带有循环变量)。
foo
是一个环境变量,其值通过使用%foo%
的立即扩展和使用!foo!
的延迟扩展来引用。环境变量支持字符串替换,如在command prompt 窗口中运行set /?
的帮助输出中所述。 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
不支持对 argument 字符串进行字符串替换。
为了完整起见,运行for /?
的帮助输出解释了如何在循环体内引用循环 变量以及可用的修饰符(与参数引用相同)。 循环变量不支持字符串替换。
【讨论】:
以上是关于为啥子字符串不能与命令行参数一起使用?的主要内容,如果未能解决你的问题,请参考以下文章