在bat文件中查询npm错误状态

tho*_*aux 5 batch-file node.js npm

我们目前正在将我们的UI项目(总共3个)的构建转移到Grunt.为了简化转换,我想提供一个将为npm install每个项目运行的bat文件,但是我想知道在发出此命令时是否出现了问题.它只是糖衣,我以后的时候,我知道NPM呼应的错误,但我想对于那些不熟悉我的团队成员容易一些消息npmnode.

有没有办法检查npm是否遇到错误并随后停止bat文件?例如,如果未安装node,我只需检查是否为%ERRORLEVEL%1.如果是这种情况,我会回显一些指令并退出执行.我遇到的问题是%ERRORLEVEL%在a期间发生错误时未设置为1 npm install.

任何帮助赞赏!

Pau*_*art 5

试试这个方法。

在运行 npm 的批处理文件(我们称之为 test.bat)中,我有以下内容:

@ECHO OFF
call npm install jquery 2<&1 || exit /b 1
ECHO Continuing...
Run Code Online (Sandbox Code Playgroud)

现在,当我运行 test.bat 时,我看到以下内容:

jquery@2.1.3 node_modules\jquery
Continuing...
Run Code Online (Sandbox Code Playgroud)

但是,如果我将“jquery”更改为不存在的包的名称(即模拟 npm 故障,正如您所说,不会影响 %ERRORLEVEL%),我会看到以下内容:

npm ERR! Windows_NT 6.2.9200
npm ERR! argv "C:\\Program Files (x86)\\nodejs\\\\node.exe" "C:\\Program Files (x86)\\nodejs\\node_modules\\npm\\bin\\npm-cli.js" "install" "asdasdas"
npm ERR! node v0.10.33
npm ERR! npm  v2.3.0
npm ERR! code ETARGET

npm ERR! notarget No compatible version found: undefined@'*'
npm ERR! notarget No valid targets found.
npm ERR! notarget Perhaps not compatible with your version of node?
npm ERR! notarget This is most likely not a problem with npm itself.
npm ERR! notarget In most cases you or one of your dependencies are requesting
npm ERR! notarget a package version that doesn't exist.

npm ERR! Please include the following file with any support request:
npm ERR!     C:\Projects\XXXX\npm-debug.log
Run Code Online (Sandbox Code Playgroud)

请注意,“ECHO Continuing”行不会被执行。

2<&1”部分似乎采用 STDERR 输出并将其重定向到 STDOUT:http ://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/redirection.mspx?mfr=true

“...句柄2(即STDERR),从ipconfig命令到句柄1(即STDOUT)...”

我从/sf/answers/725152921/获取了这个解决方案


小智 2

某些命令不会更新ERRORLEVEL。我不太确定 node.js 安装如何,但我在NSLOOKUP命令中遇到了同样的问题。NPM似乎在自己的实例中运行,这可能可以解释为什么它不更新ERRORLEVEL

我可以建议您使用简单的重定向将命令的输出写入某个日志文件,然后在该文件中搜索指示安装不成功的文本。假设您正在查找“错误”一词出现的次数。批处理文件可能如下所示:

    cmd /c "npm install > install.log 2>&1"
    for /f %%a in ('type install.log ^| find /c /i "err"') do set err=%%a
    if "%err%" GTR "0" echo ERROR was encountered during installation
Run Code Online (Sandbox Code Playgroud)

逐步解释一下:

  • cmd /c "npm install > install.log 2>&1"

    执行安装并将输出重定向到install.log. 注意2>&1最后的。这是为了将错误输出和标准保存到单个文件中。原因cmd /c是关闭npm将创建的实例。没有它我就无法完成这项工作。

  • for /f %%a in ('type install.log ^| find /c /i "err"') do set err=%%a

    浏览 install.log 并将变量设置err为包含“err”的行数。

  • if "%err%" GTR "0" echo ERROR was encountered during installation

    如果err大于 0,则为echo自定义消息。

另一种方法可能是对您需要的 Node.js 部分执行基本测试,例如执行一些npm命令并检查其输出(与上面类似)。但是,我不是 node.js 方面的专家,无法在这一点上进一步指导您。