私はWindowsのバッチファイルからPATH環境変数に実行ファイルが存在するかどうかをテストする簡単な方法を探しています。実行ファイルがWindowsバッチファイルの%PATH%に存在するかどうかをテストするにはどうすればよいですか?
OSが提供していない外部ツールの使用は許可されていません。必要最小限のWindowsバージョンはWindows XPです。
私はWindowsのバッチファイルからPATH環境変数に実行ファイルが存在するかどうかをテストする簡単な方法を探しています。実行ファイルが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
にリダイレクトしたいと思うかもしれません。
@echo off
set found=
set prog=cmd.exe
for %%i in (%path%) do if exist %%i\%prog% set found=%%i
echo "%found%"
if "%found%"=="" ....
'for'は' PATH'の内容を解析するほどスマートではありません。たとえば、空白を含むディレクトリがありません。そして、 'for/f'を' delims =; 'と一緒に使っても、ディレクトリに'; 'が含まれていると正しく動作しません。 – Joey
@Joey、文字列の置換はどうですか? ';' 'を'; ':' set quotedPath = "%PATH:; =";に置き換えます。 "%" '。 – XP1
XP1:いや、まだ役に立たない。 '' C:\ Folderにセミコロンをつけてパスに ''をつけて、何が起こるかを見てみてください。少なくともここでは、すべての単語を個別に処理しようとしています。これは、以前とは違った形で行われています。 – Joey
場合によっては、出力が期待どおりに一致するかどうかを確認するこの単純な解決法が機能することがあります。最初の行はコマンドを実行し、標準出力の最後の行を取得します。
FOR /F "tokens=*" %%i in (' "xcopy /? 2> nul" ') do SET xcopyoutput=%%i
if "%xcopyoutput%"=="" echo xcopy not in path.
しかし、システム環境が他の言語を使用している場合はどうなりますか? 'setlocal'しかし'(myExecutable.exe)におけるX %%用と – Beachwalker
これは、パラメータ置換によって行うことができます。
%~$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
興味深いトリック(= %%〜$ PATHにFOUNDセット:X)がない '' %%〜$のための回避策として使用し 'for'と1行のソリューションです''〜 '$ PATH:1''を避けるために' 'PATH:X'を使用しています。 – gavenkoa
を参照してくださいには、アプリケーションを実行しようとすると、エラーその後を扱うシンプルなソリューションです。
file.exe /? 2> NUL
IF NOT %ERRORLEVEL%==9009 ECHO file.exe exists in path
エラーコード9009は、通常、ファイルが見つかりません。
唯一の欠点は、見つかった場合にはfile.exe
が実際に実行されていることです(場合によっては、それは望ましくない場合があります)。
はい、これはシンプルで正しいソリューションです! –
唯一の欠点は、 "file.exe"が実行されていることです(場合によっては不要です) – eadmaster
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
とても素敵で簡単です!ありがとう! –
Useコマンド:
PowerShellのテストパス「あなたが探してexeファイル」現在の場合はTrueを返し、そうでない場合はFalseを返します。
これは動作しません。 '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用カレントディレクトリがされていないことを考慮に入れますパス。 –
[ファイルはDOSのバッチに存在するかどうかを確認する方法]の可能複製(http://stackoverflow.com/questions/4340350/how-to-check-if-a-file-exists-in-dos-batch ) – karlphillip
@karlphilip:間違いなく。ここの質問は全く異なっています。 – Joey
受け入れられた回答にマークを付ける必要があります。 – Jeb