我正在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
我想隐藏用户的“未识别”消息,只显示“无法找到节点”。
我该如何隐藏它?
答案 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 /?