web-dev-qa-db-ja.com

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

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

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

82
sorin
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にリダイレクトすることもできます。

心に留めておく

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

65
Joey

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
67
Ryan Bemrose

以下に、アプリケーションの実行を試み、エラーを処理する簡単なソリューションを示します後で

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

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

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

18
eadmaster

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

%~$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 を参照してください

5
Chris Noe

スタートアップフォルダーで私のようなものを検索する場合は、フォルダーを移動する必要があります。たとえば、スタートアップフォルダで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!
)
0
Zafer ATLI

PowerShellオプションを探している人向け。 Get-Command コマンドレットを使用して2つのアイテムを渡すことができます。最初に.\プレフィックスを付けて現在のディレクトリの場所を指定し、次にexe名のみを指定します。

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

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

0
John C

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

FOR /F "tokens=*" %%i in (' "xcopy /? 2> nul" ') do SET xcopyoutput=%%i
if "%xcopyoutput%"=="" echo xcopy not in path.
0
bdombro
@echo off
set found=
set prog=cmd.exe
for %%i in (%path%) do if exist %%i\%prog% set found=%%i
echo "%found%"
if "%found%"=="" ....
0
PabloG

コマンドを使用:powershell Test-Path "お探しのexe"

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

0
akkidukes