web-dev-qa-db-ja.com

コマンドがバッチファイルで認識されるかどうかを判別する

私はプログラム(javacなど)を呼び出すbatスクリプトを書いています。簡単にするために、実行する前にコマンドが存在するかどうかを確認したいと思います。つまり、コマンドがPATHに存在する場合。

例えば、

if (my_command.exe is a recognized command) then (
  my_command.exe my_args
) else (
  REM Output was probably "'my_command.exe' is not recognized as an internal or external command, operable program or batch file."
  REM Do not run my_command.exe
)

Windowsでこれを行うための最良の方法は何ですか?

45
user46097
WHERE mycommand
IF %ERRORLEVEL% NEQ 0 ECHO mycommand wasn't found 
59
Josh Santangelo

以下のコードは、ガベージ出力なしで常にクリーンに実行されるはずです。

javac -version >nul 2>&1 && (
    echo found javac
) || (
    echo fail
)

出力:

found javac

ワンライナーと同じコード:

javaz -version >nul 2>&1 && ( echo found javac ) || ( echo fail )

出力:

fail

&&||の順序は重要なようです。また、存在をテストしているコマンドが機能するには、エラーレベル<= 0で戻る必要があります。うまくいけば、コマンドには/がありますか?または--help引数、またはJavaと同様に、バージョン情報コマンド。

15
ngreen

最も簡単な方法はコマンドを実行することですが、ランダムプロセスを開始したくない場合があるため、もちろん他の問題があります。

_for %%x in (my_command.exe) do if not [%%~$PATH:x]==[] set MyCommandFound=1
_

_%PATH%_環境変数によってリストされたパスでプログラムを検索する代替手段です。基本的には、which(1)の純粋なバッチバージョンです。それはより良くすることができますが、本質的にこれはそれです。

7
Joey

私の状況では。最も簡単な方法は、||または&&演算子。

my_command.exe -version 2>NUL && echo "my_command exists"

または

my_command.exe -version 2>NUL || echo "my_command doesn't exist"
3
user46097

以下のバージョンに対するいくつかの改良。そのコマンドが存在することをテストし、不要な出力を抑制します。

WHERE scp >nul 2>nul
IF %ERRORLEVEL% EQU 0 ECHO scp found
3
yuliskov

追加のツールのインストールが必要な場合は、リソースキットにwhereコマンドがあります。 Windowsのwhereis?に相当 を参照してください。

それ以外の場合、それほど古くないWindowsのバージョンでは、 PATH以外の実行可能ルックアップを実行 で説明されているように、純粋なcmdで実行できます。

私はこれがあなたが探しているものではないことを知っていますが、ロジックのわずかな変更でそれはあなたが必要とするものを達成するはずです。

実行されるすべてのコマンドには戻りコード(別名errorlevel)があり、戻りコードが0(ゼロ)の場合、コマンドは正常に実行されています。戻りコードが0より大きい場合、何か問題が発生しています。

詳細は here を参照してください。

何かのようなもの -

my_command
if (%ERRORLEVEL% > 0) then (
  REM Output was probably "'my_command.exe' is not recognized as an internal or external command, operable program or batch file.  OR SOMETHING WENT WRONG WITH IT."
  REM Do not run my_command.exe
)
1
bryan

これらの方法はすべて機能する可能性がありますが、組み込みの方法ではどうですか?

If exists my_command do echo "my_command exists"

「if /?」を実行します詳細はコマンドラインで

0
uSlackr