Как проверить, существует ли исполняемый файл в% PATH% из пакетного файла Windows? - PullRequest
82 голосов
/ 24 января 2011

Я ищу простой способ проверить, существует ли исполняемый файл в переменной среды PATH из пакетного файла Windows.

Использование внешних инструментов, не предоставляемых ОС, не допускается.Минимальная требуемая версия Windows - Windows XP.

Ответы [ 9 ]

67 голосов
/ 06 сентября 2014

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
64 голосов
/ 24 января 2011
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.

18 голосов
/ 05 ноября 2013

Вот простое решение, которое пытается запустить приложение и обрабатывает любую ошибку впоследствии .

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

Код ошибки 9009 обычно означает, что файл не найден.

Единственным недостатком является то, что file.exe фактически выполняется, если найдено (что в некоторых случаях не является желательным).

4 голосов
/ 24 сентября 2013

Это может быть выполнено путем подстановки параметров.

%~$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

0 голосов
/ 25 марта 2019

Если вы ищете что-то вроде меня в папке автозагрузки, должна идти папка.Например, я ищу 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 голосов
/ 31 января 2019

Для тех, кто ищет вариант PowerShell.Вы можете использовать командлет Get-Command, передавая два элемента.Сначала укажите текущее местоположение директории с префиксом .\, затем укажите только имя exe.

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

Это вернет true, если найден локальным или в общесистемных путях.

0 голосов
/ 26 июня 2015

Используйте команду: powershell Test-Path "exe, который вы ищете"

Он вернет True, если присутствует, иначе False.

0 голосов
/ 12 июня 2013

Иногда это простое решение работает, когда вы проверяете, соответствует ли результат ожидаемому. Первая строка запускает команду и захватывает последнюю строку стандартного вывода.

FOR /F "tokens=*" %%i in (' "xcopy /? 2> nul" ') do SET xcopyoutput=%%i
if "%xcopyoutput%"=="" echo xcopy not in path.
0 голосов
/ 25 января 2011
@echo off
set found=
set prog=cmd.exe
for %%i in (%path%) do if exist %%i\%prog% set found=%%i
echo "%found%"
if "%found%"=="" ....
...