Windows下npm run kmsEncryptJson命令报错:tools未被识别
我来帮你排查这个问题,这个报错核心是Windows和Linux的脚本执行环境差异导致的,下面分几个方向给出解决方案:
1. 修复路径分隔符问题
Linux系统用正斜杠/作为路径分隔符,但Windows用反斜杠\。你脚本里的tools/bin/kms-encrypt-json在Windows环境下会被误识别为“执行tools命令,并传入bin/kms-encrypt-json作为参数”,自然会找不到tools这个命令。
你可以把脚本里的路径改成Windows兼容格式:
"scripts": { "kmsEncryptJson": "tools\\bin\\kms-encrypt-json %jsonfile% etc\\db.json --outputFile=src\\secure\\db.json" }
如果这个工具是Node.js编写的,也可以保留正斜杠(Node.js在Windows下兼容正斜杠路径),但要确保脚本入口有正确的shebang(#!/usr/bin/env node),让npm能正确调用它。
2. 修正变量语法差异
Linux下用$变量名引用变量,但Windows默认用cmd执行npm脚本,需要用%变量名%的格式。把脚本里的$jsonfile改成%jsonfile%,Windows才能正确识别这个变量。
如果习惯用PowerShell执行npm命令,变量语法还是$jsonfile,但需要确保npm配置为用PowerShell运行脚本(可以通过npm config set script-shell powershell设置)。
3. 确保kms-encrypt-json可在Windows执行
如果kms-encrypt-json是一个Shell脚本(.sh文件),Windows默认的cmd/PowerShell无法直接执行,你可以选以下方式解决:
- 用Git Bash或者WSL环境来执行npm命令,完全复用Linux下的脚本逻辑。
- 把Shell脚本转换成Windows可执行的
.cmd或.ps1脚本。 - 如果这个工具是Node.js包,确保它的
package.json里配置了bin字段,npm会自动在Windows下生成对应的.cmd包装文件,让脚本可直接执行。
4. 跨平台兼容的进阶方案
如果需要同时支持Linux和Windows,可以借助cross-env和cross-spawn工具统一执行环境:
- 先安装依赖:
npm install cross-env cross-spawn --save-dev
- 修改package.json脚本:
"scripts": { "kmsEncryptJson": "cross-env jsonfile=$jsonfile cross-spawn tools/bin/kms-encrypt-json etc/db.json --outputFile=src/secure/db.json" }
这类工具会自动处理不同系统的路径和变量差异,不用再单独写两套脚本。
另外提个小细节:你执行命令时传入的$region $keyArn参数,在当前脚本里并没有被引用到,可能需要调整脚本逻辑来接收这两个参数哦。
内容的提问来源于stack exchange,提问作者Dinesh Gouttam

