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

时间:2016-01-21 17:24:45

标签: windows batch-file cmd

我正在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
)

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

'node' is not recognized as an internal or external command,
operable program or batch file.
node could not be found

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

我该如何隐藏它?

3 个答案:

答案 0 :(得分:3)

您可以使用此错误级别检查专门测试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
)

答案 1 :(得分:3)

禁止错误消息,将其重定向到NUL:

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

另一种方式(灵感来自Npocmaka的答案):

where node.exe >nul 2>&1 && echo installed || echo not installed

或更接近原始输出:

where node.exe >nul 2>&1 && node %~dp0app.js || echo node could not be found

答案 2 :(得分:1)

最干净的方法是检查可执行文件是在路径中还是在本地目录中显示:

set "status=not installed"

if exist "./node.exe" (
    set "status=installed"
)

for %%# in (node.exe) do  if not "%%~f$PATH:#" equ "" set "status=installed"

echo %status%

if "%status%" equ "installed" (
   node %~dp0app.js
)

用于%%~f$PATH支票FOR /?