我有一个 Windows CMD 脚本,它接受许多参数并执行一个 EXE,首先传递一些硬编码的参数,然后传递来自用户的所有参数。CMD 脚本如下所示:
launcher.exe paramX paramY %*
用户将从 Windows shell 执行 CMD 脚本,如下所示:
launcher.cmd param1 param2 param3 [...]
我遇到的问题是,如果 CMD 脚本的参数包含 shell 特殊字符,例如<
>
and ^
,则用户被迫通过在每个前面加上 3 个插入符号^
shell 转义字符来转义这些字符。
两个例子
1) 要将参数传递ten>one
给 EXE,用户必须按如下方式启动 CMD:
launcher.cmd ten^^^>one
这样做的原因是 shell 特殊字符^
和>
命令 shell 在两个级别上解释,第一个在命令行上,第二个在 CMD 脚本内。因此,^
必须应用两次使用插入符号 shell 转义字符进行转义的 shell。问题是这对用户来说是不明显的并且看起来很丑陋。
对于此示例,更好的解决方案是用双引号将参数括起来。但是,对于在参数中包含文字双引号的更复杂的示例,这会失效。
2) 要将参数传递"^
给 EXE,用户必须按如下方式启动 CMD:
launcher.cmd "\"^^^^"
在我的情况下,我想支持包含任何低 ASCII 字符序列的参数,不包括控制字符,即代码点 0x20 到 0x7E。我知道会有一些例子,用户必须用插入符号转义某些 shell 特殊字符。但是,我不希望用户在这些情况下每次都必须使用3 个插入符号,因为他们碰巧调用的是 CMD 脚本而不是 EXE。
我可以通过将 CMD 脚本替换为执行相同操作的 EXE 来解决此问题。但是,有没有办法改变 CMD 脚本,使其参数通过 EXE 而不解释 shell 特殊字符?