如何将“=”作为参数的一部分从 Windows 的 bit-bash 传递给 .cmd 或 .bat 文件

Posted

技术标签:

【中文标题】如何将“=”作为参数的一部分从 Windows 的 bit-bash 传递给 .cmd 或 .bat 文件【英文标题】:how to pass "=" as part of argument to .cmd or .bat file from bit-bash for windows 【发布时间】:2021-10-29 05:19:42 【问题描述】:

在我在 windows10 中打开的 git-bash shell 中,这个测试

./test.cmd 123=456

返回 123

test.cmd 的内容是:

echo %1

我试过./test.cmd 123\=456123^456 还是不行。

如果我从 cmd shell 运行 ./test.cmd 123=456,它可以正常工作并输出 123=456。 我可以转义其他特殊字符,只是不能=

$ ./test.bat "123^^^&456"

C:\Users\551527>echo 123&456
123&456

551527@S29C0N4 MINGW64 ~
$ ./test.bat "123^^^=456"

C:\Users\551527>echo 123

123

= 有什么不同?

【问题讨论】:

我会说这与 Windows 如何解释批处理脚本有关。这不是 Git Bash 做的,但 cmd 做的我很确定。我刚刚在cmd 中进行了相同的测试并得到了相同的结果。 嗯,编辑你的问题,我刚刚注意到你说你在cmd 中得到不同的结果,所以我再次测试,当我在cmd 中运行test.cmd 123=456 时,我确实得到了123。我不明白为什么你会看到不同的结果。 此外,在cmd./test.cmd 123=456 给我错误'.' is not recognized as an internal or external command,。我必须运行.\test.cmd 123=456 才能获得输出123,所以我必须问你是否确定测试确实在cmd 中运行,即使这看起来像是一个愚蠢的问题。 【参考方案1】:

第一个问题:等号是cmd.exe中的分隔符

如果您以分隔符开始批处理文件,这只会拆分参数。

myBatch.bat three;argu=ments

-- %1 = three
-- %2 = argu
-- %3 = ments
-- %* = three;argu=ments

为避免拆分,您必须使用引号(插入符号在这里不起作用)。

myBatch.bat "three;argu=ments"

--  %1 = "three;argu=ments"
-- %~1 = three;argu=ments

第二个问题:git-bash 与参数的工作方式不同

bash 对参数有不同的规则,它决定什么是单个参数并删除周围的引号

使用

./myBatch.bat "三个;argu=ments"

由 bash 解析,检测到单个参数,然后使用该单个参数调用 cmd.exe,例如:

cmd /c myBatch.cmd three;argu=ments

在这一点上,很明显你不能构建一个复杂的命令行,它适用于 cmd.exe 和 bash。

可以为具体问题构建解决方案,但总是很痛苦。

【讨论】:

以上是关于如何将“=”作为参数的一部分从 Windows 的 bit-bash 传递给 .cmd 或 .bat 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何将函数作为参数从 C 传递到 C++ 并返回到 C

如何通过 Windows 上的 system() 函数将换行符作为参数传递?

如何将某些活动的上下文作为参数传递

如何将向量的一部分作为函数参数传递?

如何将运行时参数作为依赖解析的一部分传递?

将字符串从控制器传递到部分视图作为 javascript 函数参数