Windowsバッチファイルの%PATH%に実行可能ファイルが存在するかどうかをテストする方法


89

WindowsバッチファイルのPATH環境変数に実行可能ファイルが存在するかどうかをテストする簡単な方法を探しています。

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



15
@karlphilip:間違いなく。ここでの質問はかなり異なります。
ジョーイ

1
承認された回答をマークする必要があります。
ジェブ

回答:


69
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バージョンにもすでに存在している可能性がありますが、私はそれにアクセスすることができないため、わかりません。私のマシンでは以下も機能します:

where myExecutable

見つからなかった場合は、ゼロ以外の終了コードで戻ります。ただし、バッチではNUL、出力をにリダイレクトすることもできます。

心に留めて

バッチ(.bat)ファイルとコマンドラインでの解析は異なります(バッチファイルには%0%9があるため)。そこで、ファイルを2倍にする%必要があります。コマンドラインではこれは必要ないので、変数の場合はです%X


1
私はあなたのアプローチが好きですが、フルバージョンを提供できればさらに良いでしょう。これにはPATHEXTも使用します。
ソリン

4
XPの場合、ループスクリプトが必要です(またはRKからwhere.exeをダウンロードします)。Vistaおよび7にはwhere.exeが付属しています。OPがXPを具体的に言っていることは知っていますが、後世には常に使用するのが最善の答えですwhere myExecutable
ライアンベムローズ

ライアン:えっ?私はあなたの文を解析できないと思います。
Joey

2
私はバッチスクリプトの初心者で、%% xの意味がわかりません。私のWindows 7システムで次のように入力してみました:(myExecutable.exe)の%% Xに対して(FOUND = %%〜$ PATH:Xを設定)してから、リターンキーを押してください。C:\ Users \ James> for %% X in(cmd.exe)do(set FOUND = %%〜$ PATH:X)%% Xは現時点では予期されていませんでした。
simgineer

3
simengineer:バッチファイルとコマンドラインでの解析は異なります(バッチファイルには%0%9があるため)%。そこで、2倍にする必要があります。コマンドラインではこれは必要ないので、for変数はただ%xです。
Joey

79

Windows Vista以降のバージョンにwhere.exeは、パス内のプログラムを検索するというプログラムが付属しています。それはこのように動作します:

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

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

バッチファイルで使用するには、/qスイッチを使用します。このスイッチは、設定ERRORLEVELを行い、出力を生成しません。

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

とても素敵でシンプル!ありがとう!
Pawel Cioch

18

これは、アプリケーションの実行を試み、後でエラーを処理する簡単なソリューションです。

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

エラーコード9009は通常、ファイルが見つからないことを意味します。

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


24
唯一の欠点は、「file.exe」が実行されることです(場合によっては不要です)
eadmaster '19

6

これは、パラメーターの置換によって実現できます。

%~$PATH:1

これは、%1の実行可能ファイル名の完全パスを返します。それ以外の場合は空の文字列を返します。

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

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

goto :eof

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

http://ss64.com/nt/syntax-args.htmlを参照してください


1
興味深いトリックsetlocalが、for %%X in (myExecutable.exe) do (set FOUND=%%~$PATH:X)と1行のソリューションであるforため、回避策として使用し%%~$PATH:Xないようにするために、call%~$PATH:1
ジバンコア2017年

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%"=="" ....

3
forの内容を解析するほどスマートではないため、機能しませんPATH。たとえば、スペースのあるディレクトリは見逃されます。そしてfor /fdelims=;それを使用しても、ディレクトリに;とが含まれている場合は正しく動作しません。
ジョーイ

@Joey、文字列置換はどうですか?交換する;"; "set quotedPath="%PATH:;="; "%"
XP1 2012

1
XP1:いいえ、まだ役に立たない。"C:\Folder with; semicolon, quoted"パスに追加して試して、何が起こるかを確認してください。少なくともここでは、すべての「単語」を個別に処理しようとしますが、これはある意味で以前の動作よりも悪いことです。
ジョーイ

0

時々、この単純な解決策が機能し、出力が期待と一致するかどうかを確認します。最初の行はコマンドを実行し、標準出力の最後の行を取得します。

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

しかし、システム環境が他の言語を使用している場合はどうなりますか?
Beachwalker 2013

0

起動フォルダで私のようなものを検索している場合は、フォルダに移動する必要があります。たとえば、スタートアップフォルダーでexeを検索し、このコードを次のように使用します

@echo off
cd C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
where /q program.exe
IF ERRORLEVEL 1 (
echo F | xcopy /Y /S /I /E "\\programsetup\programsetup.exe" 
"C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\program.exe"
) ELSE (
ECHO Application exists. Let's go!
)

しかし、これはprogram.exe1つのフォルダだけでなく、存在する場合は完全なパスを検索します
jeb

-1

コマンドを使用します:powershell Test-Path "あなたが探しているexe"

存在する場合はTrueを返し、それ以外の場合はFalseを返します。


これは機能しません。Test-Path指定されたパスのみをチェックします。つまり、が現在のディレクトリにあるTest-Path nuget.exe場合にのみtrueを返しますnuget.exe。nuget.exeが現在のディレクトリにない場合、PATH変数にリストされているディレクトリにある場合でも、falseを返します。PowerShellではGet-Commandうまくいくかもしれませんが(stackoverflow.com/questions/11242368/…)、PowerShellでは現在のディレクトリがパスに含まれていないことを考慮してください。
RonaldZarīts15年

1
@RonaldZaritsが指摘したように、PowerShellを完全にサポートするには、2つのオプションを指定してGet-Commandを使用できます。最初に現在のディレクトリの場所を指定し、次にexe名のみを指定します。(Get-Command ".\notepad", "notepad" -ErrorAction Ignore -CommandType Application) -ne $nullローカルまたはパスで見つかった場合はtrueを返します。
ジョンC

-1

PowerShellオプションをお探しの方に。Get-Command2つの項目を渡すコマンドレットを使用できます。最初に現在のディレクトリの場所を.\プレフィックス付きで指定し、次にexe名のみを指定します。

(Get-Command ".\notepad", "notepad" -ErrorAction Ignore -CommandType Application) -ne $null

ローカルまたはシステム全体のパスで見つかった場合、trueを返します。


ユーザーに反対票を投じて実行するのに勝るものはありません。同意しない場合は、反対票を投じるつもりである場合は、コメントも追加して、望ましい結果を得るための良い方法ではないことに同意しない理由を説明してください。
ジョンC
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.