Я ищу простой способ проверить, существует ли исполняемый файл в переменной среды PATH из командного файла Windows.
Использование внешних инструментов, не предусмотренных ОС, не допускается. Минимальная необходимая версия Windows - Windows XP.
Я ищу простой способ проверить, существует ли исполняемый файл в переменной среды PATH из командного файла Windows.
Использование внешних инструментов, не предусмотренных ОС, не допускается. Минимальная необходимая версия Windows - Windows XP.
Ответы:
Если вам это нужно для разных расширений, просто повторите
PATHEXT
:Возможно, он
where
уже существует в устаревших версиях Windows, но у меня нет доступа к нему, поэтому я не могу сказать. На моей машине также работает следующее:и возвращается с ненулевым кодом выхода, если его не удалось найти. Однако в пакете вы, вероятно, также захотите перенаправить вывод в
NUL
.Иметь ввиду
Разбор в
.bat
файлах batch ( ) и в командной строке отличается (потому что в пакетных файлах есть%0
-%9
), поэтому вам нужно удвоить%
там. В командной строке это не обязательно, поэтому для переменных просто%X
.источник
where myExecutable
.%0
-%9
), поэтому вам нужно удвоить%
там. В командной строке в этом нет необходимости, поэтому используютсяfor
переменные%x
.Windows Vista и более поздние версии поставляются с программой,
where.exe
которая ищет программы в пути. Это работает так:Для использования в пакетном файле вы можете использовать
/q
переключатель, который просто устанавливаетERRORLEVEL
и не производит никакого вывода.Или простая (но менее читаемая) сокращенная версия, которая печатает сообщение и закрывает ваше приложение:
источник
Вот простое решение, которое пытается запустить приложение и впоследствии обрабатывает любые ошибки .
Код ошибки 9009 обычно означает, что файл не найден.
Единственным недостатком является то, что
file.exe
фактически выполняется, если он найден (что в некоторых случаях нежелательно).источник
Это можно сделать с помощью подстановки параметров.
Это возвращает полный путь к исполняемому файлу в% 1 или пустую строку.
Это не работает с пользовательскими переменными. Поэтому, если имя исполняемого файла не является параметром вашего скрипта, вам нужна подпрограмма. Например:
См. Http://ss64.com/nt/syntax-args.html
источник
setlocal
ноfor %%X in (myExecutable.exe) do (set FOUND=%%~$PATH:X)
одно решением линии сfor
использоваться в качестве временного решения для%%~$PATH:X
того , чтобы избежатьcall
и%~$PATH:1
.источник
for
недостаточно умен, чтобы анализировать содержимоеPATH
. Например, он будет пропускать каталоги с пробелами. И даже при использованииfor /f
сdelims=;
ним он не будет работать правильно, если каталог содержит и заключен;
в кавычки.;
с"; "
:set quotedPath="%PATH:;="; "%"
."C:\Folder with; semicolon, quoted"
к пути, и посмотрите, что произойдет. По крайней мере, здесь он пытается рассматривать каждое «слово» отдельно, что в некотором смысле хуже, чем поведение раньше.Иногда работает это простое решение, когда вы проверяете, соответствует ли результат ожидаемому. Первая строка выполняет команду и захватывает последнюю строку стандартного вывода.
источник
Если вы ищете что-то вроде меня в папке автозагрузки, следует перейти в папку. Например, я ищу exe в папке автозагрузки, и я использую этот код, например
источник
program.exe
не только в одной папке, но и в полном ПУТИ, если он существует,Используйте команду: powershell Test-Path "exe, который вы ищете"
Он вернет True, если присутствует, в противном случае - False.
источник
Test-Path
проверяет только указанный путь, т.е.Test-Path nuget.exe
вернет истину, только еслиnuget.exe
находится в текущем каталоге. Если nuget.exe отсутствует в текущем каталоге, он вернет false, даже если он находится в каталоге, указанном в переменной PATH. В PowerShellGet-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
Это вернет истину, если будет найдено локальные или общесистемные пути.
источник