Windows系统下如何通过.sh文件并行运行2个及以上npm任务
问题根因
你写的.sh是类Unix系统的Bash/Bourne Shell脚本,Windows原生不支持该类脚本的直接执行,且脚本执行逻辑默认是同步阻塞的:当前台启动的命令未退出时,脚本会暂停在当前行,不会执行后续逻辑。你写的第一个npm run是常驻前台的进程,只要不手动终止,脚本永远不会走到切换目录、启动第二个npm任务的步骤。
可行解决方案
根据你实际使用的脚本运行环境选对应方案即可:
方案1:保留.sh脚本格式(适用于用Git Bash/WSL/Cygwin等兼容层跑脚本的场景)
只需要在第一个npm启动命令末尾加&,将该进程放到后台运行,即可不阻塞后续脚本执行。注意保留第二个npm进程在前台运行,避免脚本执行完直接退出导致进程残留,按Ctrl+C终止前台进程时可统一结束所有关联任务。
修正后的脚本代码:
cd UAA_Generators/JapaneseSyntax/ByNodeJS/DataStructures/Tokens || exit npm run "Incremental building" & cd ../ModulesCollection || exit npm run "Incremental building"
代码说明:
- 命令末尾的
&是Bash内置语法,作用是将前置命令放入后台执行,脚本无需等待该命令退出即可继续往下走 - 保留第二个npm任务在前台运行,终端不会直接退出,两个任务的日志都会输出在当前窗口,按Ctrl+C可终止前台任务,同时后台启动的第一个npm任务也会随脚本退出被自动回收
方案2:使用Windows原生PowerShell脚本(无需额外装兼容层,系统自带支持)
如果没有安装类Unix兼容层,直接写PowerShell脚本(后缀为.ps1)适配Windows环境更稳定,用Start-Process拉起第一个后台进程即可:
Set-Location "UAA_Generators/JapaneseSyntax/ByNodeJS/DataStructures/Tokens" Start-Process npm -ArgumentList "run", "Incremental building" Set-Location "../ModulesCollection" npm run "Incremental building"
代码说明:
Start-Process会独立拉起第一个npm进程,不会阻塞当前脚本执行- 第二个npm任务在当前终端前台运行,按Ctrl+C可终止前台任务,第一个后台任务可在任务管理器或新开终端执行
taskkill /im node.exe /f统一清理
方案3:使用Windows原生CMD批处理脚本(双击即可运行,适配所有Windows版本)
如果需要最轻量化的原生脚本,直接写后缀为.bat/.cmd的批处理脚本即可,用内置的start命令拉起后台进程:
@echo off cd /d UAA_Generators\JapaneseSyntax\ByNodeJS\DataStructures\Tokens start "" npm run "Incremental building" cd /d ..\ModulesCollection npm run "Incremental building"
代码说明:
start命令后紧跟的空引号是必填参数,用于占用控制台窗口标题位,避免命令解析失败- 第一个npm任务会被拉起在独立的控制台窗口运行,第二个任务保留在当前窗口,两个进程互不阻塞
补充说明
.sh后缀默认对应类Unix系统的Bash/Bourne Shell环境,和Windows原生的PowerShell、CMD指令语法不通用,在Windows上直接双击.sh文件会因为没有默认解释器无法运行- 不要把两个常驻npm任务都放到后台运行,否则脚本执行完会直接退出,容易出现后台进程残留、无法正常关闭的问题
内容的提问来源于stack exchange,提问作者Takeshi Tokugawa YD
相关产品推荐
相关产品推荐

