Как проверить, существует ли исполняемый файл в %PATH% из пакетного файла windows?
Я ищу простой способ проверить, существует ли исполняемый файл в переменной среды PATH из пакетного файла Windows.
использование внешних инструментов, не предусмотренных ОС, не допускается. Минимальная требуемая версия Windows-это Windows XP.
7 ответов:
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
), так что вы должны удвоить%
там. В командной строке это не нужно, поэтому для переменных просто%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
@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 /F "tokens=*" %%i in (' "xcopy /? 2> nul" ') do SET xcopyoutput=%%i if "%xcopyoutput%"=="" echo xcopy not in path.