You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何解决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后,所有带&&的脚本都能正常跑,再也没遇到过路径截断的问题😎

火山引擎 最新活动