Как проверить, существует ли исполняемый файл в %PATH% из пакетного файла windows?


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

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

7 76

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

см.http://ss64.com/nt/syntax-args.html

@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.