如何解决Windows PowerShell无法正确执行bun/npm的package.json自定义脚本(含&&)的问题
如何解决Windows PowerShell无法正确执行bun/npm的package.json自定义脚本(含&&)的问题
哎,这个坑我之前踩过好几次!Windows下PowerShell和cmd的语法差异加上bun/npm默认shell的问题,确实容易让带&&的脚本炸锅,尤其是你碰到的'C:\Program' is not recognized,明显是路径里的空格被错误拆分了,再配合旧版PowerShell不支持&&的问题,直接触发报错。
先理清楚问题根源
- 旧版PowerShell(5.1及以下)不原生支持
&&作为“前命令成功才执行后命令”的短路运算符,解析时会出逻辑错误; - bun/npm在Windows下有时会默认调用cmd.exe执行脚本,而cmd对带空格的路径(比如
C:\Program Files里的npm)处理容易出错,导致命令被截断成C:\Program这种无效路径。
具体解决办法
办法1:修改脚本为PowerShell兼容语法(适合不想改默认shell的情况)
直接在脚本里指定用PowerShell执行,并用PowerShell的语法实现&&的短路效果:
"scripts": { "bump": "powershell -Command \"git add .; if ($?) { npm version patch -m 'Release %s' }; if ($?) { git push origin master --tags }\"" }
这里$?是PowerShell的内置变量,用来判断上一条命令是否执行成功,和&&的逻辑完全一致。
办法2:改成cmd兼容的脚本写法
如果bun/npm默认用cmd执行,调整脚本适配cmd的规则:
"scripts": { "bump": "git add . && call npm version patch -m \"Release %%s\" && git push origin master --tags" }
- 用
call命令调用npm,避免带空格的路径被截断; - cmd里的
%需要转义成%%,所以把%s改成%%s。
办法3:强制bun/npm使用PowerShell 7+执行脚本(推荐)
如果你已经装了PowerShell 7(也就是pwsh.exe),直接把bun/npm的默认shell改成它:
- 对于npm,在PowerShell里执行:
npm config set script-shell pwsh - 对于bun,执行:
bun config set script-shell pwsh
改完之后,脚本里的&&就能正常用了——PowerShell 7+原生支持这个运算符,还能完美处理带空格的路径,之后再写跨平台脚本也省心。
办法4:升级PowerShell到7.x版本
如果还在Windows自带的PowerShell 5.1,直接升级到7.x版本就行。升级后不仅支持&&,对各种跨平台shell语法的兼容也会好很多,一劳永逸解决这类问题。
额外提示
你看到的LF will be replaced by CRLF只是git的换行符提示,和脚本执行失败没关系,要是看着烦,执行git config core.autocrlf false就能关闭这个提示,完全不影响功能。
我当时是直接用了办法3,改完默认shell后,所有带&&的脚本都能正常跑,再也没遇到过路径截断的问题😎




