bat 脚本 参数带等号问题 求解

2022-07-18 11:23:12 +08:00
 freakxx
PS C:\Users\x\Desktop> type .\test.bat
@echo all : %*
@echo arg1 : %1
@echo arg2 : %2

PS C:\Users\x\Desktop> .\test.bat "aaa=bbb,ccc" "ddd;eee"
all : aaa=bbb,ccc ddd;eee
arg1 : aaa
arg2 : bbb

切到 win 去玩了下脚本,发现参数里带等号也会直接被解析,请问这种情况,怎么直接传进去一个带等号的字符串不被解析

或者我应该怎么取参数才是正确的

1975 次点击
所在节点    Windows
14 条回复
Rache1
2022-07-18 11:26:39 +08:00
未能复现

Rache1
2022-07-18 11:29:12 +08:00
@Rache1 😲 楼主用的 powershell ,确实有这个问题
AoEiuV020CN
2022-07-18 11:31:10 +08:00
刚知道 powershell 还有这种坑,
Rache1
2022-07-18 11:37:42 +08:00
这样就可以

start-process "cmd.exe" '/c .\xxx.bat "aaa=bbb,ccc" "ddd;eee"' -Wait -NoNewWindow
freakxx
2022-07-18 11:40:22 +08:00
@Rache1 #4

哈哈哈感觉这样复杂了些,那我可能考虑直接在 cmd 直接执行就算了,就不兜圈了

不过这个感觉确实有些扯淡。。。包在双引号里还能被解析,这就有些不太合理
Rache1
2022-07-18 11:42:11 +08:00
或者在外面再包一层单引号

.\xxx.bat '"aaa=bbb,ccc"' '"ddd;eee"'
freakxx
2022-07-18 11:48:51 +08:00
@Rache1 #6

嗯嗯,可以啦,
我发现好像是我测试漏了
刚才也尝试用这种方式不让解析,

感谢 :)
ysc3839
2022-07-18 11:53:02 +08:00
这里的问题应该是 PowerShell 把引号当成字符串了,传递给 cmd 的参数中不包含引号,cmd 对包含等号但不含引号的参数又进行了某些处理。

另外还想吐槽,Windows 启动新进程的命令行参数是只能传递一个字符串的,而 Unix 能传递字符串数组。因此在 Windows 下有的时候传递参数很麻烦,尤其是在不同 shell 中多层传递的情况,你得按照目标程序的解析规则 escape 好,而 Unix 则可以把解析好的字符串数组直接传过去。
cpstar
2022-07-18 11:53:35 +08:00
powershell 里会各种拆分,不仅仅是等号,还有逗号、分号。你可以试试 arg3\4\5\6 就知道了。
freakxx
2022-07-18 12:04:29 +08:00
@ysc3839 #8

今天在翻有看到一个文档解析怎么解析,没细看;

哈哈哈,是的,从 shell 切到 bat 来处理,总感觉会比较繁琐了些
解析规则也相对没那么直观
ColorfulBoar
2022-07-18 12:37:00 +08:00
abvatous
2022-07-18 13:44:47 +08:00
我歪个楼

op 你这个帖子为什么打开有背景图的啊?还是说是 windows 节点的?
freakxx
2022-07-18 14:04:12 +08:00
@abvatous #12

哈哈哈节点问题
ipcjs
2022-07-19 02:02:22 +08:00
Windows 也可以写 sh 脚本呀,为什么要想不开写 bat/powershell😅

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/866945

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX