Я ищу простой способ проверить, существует ли исполняемый файл в переменной среды 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
файлах batch ( ) и в командной строке отличается (потому что в пакетных файлах есть %0
- %9
), поэтому вам нужно удвоить %
там. В командной строке это не обязательно, поэтому для переменных просто %X
.
where myExecutable
.
%0
- %9
), поэтому вам нужно удвоить %
там. В командной строке в этом нет необходимости, поэтому используются for
переменные %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
setlocal
но for %%X in (myExecutable.exe) do (set FOUND=%%~$PATH:X)
одно решением линии с for
использоваться в качестве временного решения для %%~$PATH:X
того , чтобы избежать call
и %~$PATH:1
.
@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=;
ним он не будет работать правильно, если каталог содержит и заключен ;
в кавычки.
;
с "; "
: set quotedPath="%PATH:;="; "%"
.
"C:\Folder with; semicolon, quoted"
к пути, и посмотрите, что произойдет. По крайней мере, здесь он пытается рассматривать каждое «слово» отдельно, что в некотором смысле хуже, чем поведение раньше.
Иногда работает это простое решение, когда вы проверяете, соответствует ли результат ожидаемому. Первая строка выполняет команду и захватывает последнюю строку стандартного вывода.
FOR /F "tokens=*" %%i in (' "xcopy /? 2> nul" ') do SET xcopyoutput=%%i
if "%xcopyoutput%"=="" echo xcopy not in path.
Если вы ищете что-то вроде меня в папке автозагрузки, следует перейти в папку. Например, я ищу 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!
)
program.exe
не только в одной папке, но и в полном ПУТИ, если он существует,
Используйте команду: powershell Test-Path "exe, который вы ищете"
Он вернет True, если присутствует, в противном случае - False.
Test-Path
проверяет только указанный путь, т.е. Test-Path nuget.exe
вернет истину, только если nuget.exe
находится в текущем каталоге. Если nuget.exe отсутствует в текущем каталоге, он вернет false, даже если он находится в каталоге, указанном в переменной PATH. В PowerShell Get-Command
может работать лучше ( stackoverflow.com/questions/11242368/… ), но учтите, что для PowerShell текущий каталог находится не в пути.
(Get-Command ".\notepad", "notepad" -ErrorAction Ignore -CommandType Application) -ne $null
вернет истину, если найден локально или в пути.
Для тех, кто ищет вариант PowerShell. Вы можете использовать Get-Command
командлет, передавая два элемента. Сначала укажите текущее местоположение .\
каталога с префиксом, затем укажите только имя exe.
(Get-Command ".\notepad", "notepad" -ErrorAction Ignore -CommandType Application) -ne $null
Это вернет истину, если будет найдено локальные или общесистемные пути.