WindowsバッチファイルのPATH環境変数に実行可能ファイルが存在するかどうかをテストする簡単な方法を探しています。
OSによって提供されていない外部ツールの使用は許可されていません。最低限必要なWindowsバージョンはWindows XPです。
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
。
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
以下に、アプリケーションの実行を試み、エラーを処理する簡単なソリューションを示します後で。
file.exe /? 2> NUL
IF NOT %ERRORLEVEL%==9009 ECHO file.exe exists in path
エラーコード9009は通常、ファイルが見つからないことを意味します。
唯一の欠点は、file.exe
が見つかった場合、実際に実行されます(場合によっては、これは望ましくありません)。
これは、パラメータの置換によって実現できます。
%~$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 を参照してください
スタートアップフォルダーで私のようなものを検索する場合は、フォルダーを移動する必要があります。たとえば、スタートアップフォルダで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!
)
PowerShellオプションを探している人向け。 Get-Command
コマンドレットを使用して2つのアイテムを渡すことができます。最初に.\
プレフィックスを付けて現在のディレクトリの場所を指定し、次にexe名のみを指定します。
(Get-Command ".\notepad", "notepad" -ErrorAction Ignore -CommandType Application) -ne $null
ローカルパスまたはシステム全体のパスで見つかった場合、trueを返します。
時には、この単純な解決策が機能し、出力が期待したものと一致するかどうかを確認します。最初の行はコマンドを実行し、標準出力の最後の行を取得します。
FOR /F "tokens=*" %%i in (' "xcopy /? 2> nul" ') do SET xcopyoutput=%%i
if "%xcopyoutput%"=="" echo xcopy not in path.
@echo off
set found=
set prog=cmd.exe
for %%i in (%path%) do if exist %%i\%prog% set found=%%i
echo "%found%"
if "%found%"=="" ....
コマンドを使用:powershell Test-Path "お探しのexe"
存在する場合はTrue、そうでない場合はFalseを返します。