Я ищу простой способ проверить, существует ли исполняемый файл в переменной среды PATH из командного файла Windows.
Использование внешних инструментов, не предоставляемых ОС, не допускается. Минимальной версией Windows является Windows XP.
Я ищу простой способ проверить, существует ли исполняемый файл в переменной среды PATH из командного файла Windows.
Использование внешних инструментов, не предоставляемых ОС, не допускается. Минимальной версией 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, но у меня нет доступа к одной, поэтому я не могу сказать. На моей машине также работает следующее:
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 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.
Использовать команду: powershell Test-Path "exe, который вы ищете"
Он вернет True, если его присутствует, иначе False.
Для тех, кто ищет вариант PowerShell. Вы можете использовать командлет Get-Command
, передавая два элемента. Сначала укажите текущее местоположение директории с префиксом .\
, Затем укажите только имя исполняемого файла.
(Get-Command ".\notepad", "notepad" -ErrorAction Ignore -CommandType Application) -ne $null
Это вернет true, если найден локальным или в общесистемных путях.