2011-01-24 8 views
71

私はWindowsのバッチファイルからPATH環境変数に実行ファイルが存在するかどうかをテストする簡単な方法を探しています。実行ファイルがWindowsバッチファイルの%PATH%に存在するかどうかをテストするにはどうすればよいですか?

OSが提供していない外部ツールの使用は許可されていません。必要最小限のWindowsバージョンはWindows XPです。

+1

[ファイルはDOSのバッチに存在するかどうかを確認する方法]の可能複製(http://stackoverflow.com/questions/4340350/how-to-check-if-a-file-exists-in-dos-batch ) – karlphillip

+13

@karlphilip:間違いなく。ここの質問は全く異なっています。 – Joey

+1

受け入れられた回答にマークを付ける必要があります。 – Jeb

答えて

59
for %%X in (myExecutable.exe) do (set FOUND=%%~$PATH:X) 
if defined FOUND ... 

あなたが別の拡張のためにこれを必要な場合は、単にPATHEXTを反復:

set FOUND= 
for %%e in (%PATHEXT%) do (
    for %%X in (myExecutable%%e) do (
    if not defined FOUND (
     set FOUND=%%~$PATH:X 
    ) 
) 
) 

ので、whereも従来のWindowsのバージョンにすでに存在しているが、私は1へのアクセスを持っていないということだろう分かりません。

where myExecutable 

をし、それが見つからなかった場合はゼロ以外の終了コードを返します。私のマシン上で以下も動作します。バッチでは、出力をNULにリダイレクトしたいと思うかもしれません。

+1

私はあなたのアプローチが気に入っていますが、フルバージョンを提供できればさらに良いでしょう。これはPATHEXTを使っています。 – sorin

+4

XPの場合は、ループスクリプトが必要です(または、RKのwhere.exeをダウンロードしてください)。 VistaとWhere.exeと7つの出荷。私はOPが特にXPと言っているのを知っていますが、後世のために最良の答えは 'where myExecutable'を使うことです。 –

+0

Ryan:ハァッか。私はあなたの文章を解析できるとは思わない。 – Joey

0
@echo off 
set found= 
set prog=cmd.exe 
for %%i in (%path%) do if exist %%i\%prog% set found=%%i 
echo "%found%" 
if "%found%"=="" .... 
+2

'for'は' PATH'の内容を解析するほどスマートではありません。たとえば、空白を含むディレクトリがありません。そして、 'for/f'を' delims =; 'と一緒に使っても、ディレクトリに'; 'が含まれていると正しく動作しません。 – Joey

+0

@Joey、文字列の置換はどうですか? ';' 'を'; ':' set quotedPath = "%PATH:; =";に置き換えます。 "%" '。 – XP1

+0

XP1:いや、まだ役に立たない。 '' C:\ Folderにセミコロンをつけてパスに ''をつけて、何が起こるかを見てみてください。少なくともここでは、すべての単語を個別に処理しようとしています。これは、以前とは違った形で行われています。 – Joey

0

場合によっては、出力が期待どおりに一致するかどうかを確認するこの単純な解決法が機能することがあります。最初の行はコマンドを実行し、標準出力の最後の行を取得します。

FOR /F "tokens=*" %%i in (' "xcopy /? 2> nul" ') do SET xcopyoutput=%%i 
if "%xcopyoutput%"=="" echo xcopy not in path. 
+0

しかし、システム環境が他の言語を使用している場合はどうなりますか? 'setlocal'しかし'(myExecutable.exe)におけるX %%用と – Beachwalker

4

これは、パラメータ置換によって行うことができます。

%~$PATH:1 

実行可能ファイル名の完全パスを%1に返します。空の文字列を返します。

これはユーザー定義変数では機能しません。したがって、実行可能ファイル名がスクリプトのパラメータでない場合は、サブルーチンが必要です。たとえば:

call :s_which app.exe 
if not "%_path% == "" (
    app.exe 
) 

goto :eof 

:s_which 
    setlocal 
    endlocal & set _path=%~$PATH:1 
    goto :eof 

ここhttp://ss64.com/nt/syntax-args.html

+0

興味深いトリック(= %%〜$ PATHにFOUNDセット:X)がない '' %%〜$のための回避策として使用し 'for'と1行のソリューションです''〜 '$ PATH:1''を避けるために' 'PATH:X'を使用しています。 – gavenkoa

16

を参照してくださいには、アプリケーションを実行しようとすると、エラーその後を扱うシンプルなソリューションです。

file.exe /? 2> NUL 
IF NOT %ERRORLEVEL%==9009 ECHO file.exe exists in path 

エラーコード9009は、通常、ファイルが見つかりません。

唯一の欠点は、見つかった場合にはfile.exeが実際に実行されていることです(場合によっては、それは望ましくない場合があります)。

+0

はい、これはシンプルで正しいソリューションです! –

+20

唯一の欠点は、 "file.exe"が実行されていることです(場合によっては不要です) – eadmaster

51

Windows Vista以降のバージョンには、パス内のプログラムを検索するwhere.exeというプログラムが付属しています。それはこのように動作します:バッチファイルで使用するためにあなただけのERRORLEVELを設定し、任意の出力を生成しません/qスイッチを使用することができます

D:\>where notepad 
C:\Windows\System32\notepad.exe 
C:\Windows\notepad.exe 

D:\>where where 
C:\Windows\System32\where.exe 

where /q myapplication 
IF ERRORLEVEL 1 (
    ECHO The application is missing. Ensure it is installed and placed in your PATH. 
    EXIT /B 
) ELSE (
    ECHO Application exists. Let's go! 
) 

やメッセージを印刷し、アプリを終了し、簡単な(あまり読み)速記版:

where /q myapplication || ECHO Cound not find app. && EXIT /B 
+0

とても素敵で簡単です!ありがとう! –

0

Useコマンド:

PowerShellのテストパス「あなたが探してexeファイル」

現在の場合はTrueを返し、そうでない場合はFalseを返します。

+0

これは動作しません。 'Test-Path'は指定されたパスのみをチェックします。つまり' Test-Path nuget.exe'は 'nuget.exe'が現在のディレクトリにある場合のみtrueを返します。 nuget.exeが現在のディレクトリにない場合は、PATH変数にリストされているディレクトリにあっても、falseを返します。 PowerShellでは 'ゲット-Command'は(http://stackoverflow.com/questions/11242368/powershell-test-if-executable-in-path)よく働くかもしれないが、PowerShell用カレントディレクトリがされていないことを考慮に入れますパス。 –

関連する問題