2016-01-21 76 views
0

我在需要運行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 -v命令未找到),該批次的結果也顯示了以下的輸出:

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

我想隱藏來自用戶的「不認可」的消息,只是表示「節點不能被發現」。

我該如何隱藏它?

+1

當命令不存在時,cmd shell將爲%ERRORLEVEL%返回9009。請參閱http://stackoverflow.com/questions/23091906/official-ms-reference-for-cmd-exe-errorlevel-9009。沒時間留下完整的答案。 – indiv

回答

3

打壓errormessage的,它重定向到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 
+0

(upvote)我忘記了'where',儘管這個命令在XP和一些Win2003安裝中不可用。 – npocmaka

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 
) 
+0

謝謝。這似乎有竅門,但如果安裝了節點,它會輸入運行該命令的版本號 - 我也想隱藏它。所以它只是一個檢查節點是否存在(然後運行它)如果不顯示消息 - 對用戶透明。 – developer82

+0

@ developer82然後改變'node -v 2> Nul'這一行到'node -v> Nul 2>&1' – LotPings

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 /?

+1

如果「%%〜f $ MyPATH:#」Neq「」set「status = installed」'a,那麼不是'Set MyPath =。;%PAth%'後面緊跟'for %%#(node.exe)比較簡單? – LotPings

+0

@LotPings - 是的:-) – npocmaka