string - 为什么子字符串不能与命令行参数一起使用?

标签 string windows batch-file variables environment-variables

在 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/

相关文章:

php-如何在 mysql 数据库输出上显示额外的空格?

python - 使用多个分隔符有效地拆分字符串并保留每个分隔符?

c++ - 二进制数。检查以确保二进制输入是二进制时出错

java - 如何相互检查两个字符串列表?

batch-file - 如何使用批处理文件向Everyone 组授予文件夹权限

windows - 从 csv 文件中读取并根据第一列值提取某些数据列

c++ - Ubuntu 或 Windows 中的代码块。有什么不同吗?

windows - TWebBrowser 和 IE 版本

c++ - 从 QTableWidget 行/单元格拖动在 Windows 中创建可放置文件链接

windows - 如何使 Windows START 命令通过管道接受标准输入并将其传递给它调用的命令?