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

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 /? 的帮助输出解释了如何在循环体内引用循环 变量以及可用的修饰符(与参数引用相同)。 循环变量不支持字符串替换。

【讨论】:

以上是关于为啥子字符串不能与命令行参数一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

Linux操作命令

从 proc/pid/cmdline 解析命令行参数

传递命令行参数示例代码 (C 和 Python)

Linux高效数据统计命令wc

scrapy 怎样添加命令行参数

在哪个内存段中存储命令行参数? [复制]