批处理文件 - 检查命令是否可用

dev*_*r82 2 windows cmd batch-file

我正在 Windows 中编写一个需要运行 nodejs 应用程序的小批处理文件。在运行应用程序之前,我需要确保用户安装了该节点,如果没有,则向他显示需要该节点的消息。

我所做的是这样的:

@echo OFF

setlocal EnableDelayedExpansion

REM Check if node is installed
for /f "delims=" %%i in ('node -v') do set output=%%i

IF "!output!" EQU "" (
    echo node could not be found
) else (
    node %~dp0app.js
)
Run Code Online (Sandbox Code Playgroud)

如果用户安装了节点,output则将包含版本号。如果没有安装,那么它将是空的。这个逻辑有效。但是如果没有安装节点(node -v找不到命令),批处理结果还会显示以下输出:

'node' is not recognized as an internal or external command,
operable program or batch file.
node could not be found
Run Code Online (Sandbox Code Playgroud)

我想对用户隐藏“未识别”消息,只显示“找不到节点”。

我怎样才能隐藏它?

RLH*_*RLH 5

您可以使用此错误级别检查专门针对 9009 进行测试,这是未找到程序的返回码。

if "%errorlevel%" == "9009"

对于您的示例,这将起作用:

@echo OFF
REM Check if node is installed
node -v 2> Nul
if "%errorlevel%" == "9009" (
    echo node could not be found
) else (
    node %~dp0app.js
)
Run Code Online (Sandbox Code Playgroud)


Ste*_*han 5

要抑制错误消息,请将其重定向到 NUL:

set "output=not installed"
for /f "delims=" %%i in ('node -v 2^>nul') do set output=%%i
echo %output%
Run Code Online (Sandbox Code Playgroud)

另一种方式(受 Npocmaka 的回答启发):

where node.exe >nul 2>&1 && echo installed || echo not installed
Run Code Online (Sandbox Code Playgroud)

或保持更接近您的原始输出:

where node.exe >nul 2>&1 && node %~dp0app.js || echo node could not be found
Run Code Online (Sandbox Code Playgroud)