Я шукаю простий спосіб перевірити, чи існує виконуваний файл у змінній середовища 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
поверне true, лише якщо nuget.exe
знаходиться в поточному каталозі. Якщо nuget.exe відсутній у поточному каталозі, він поверне значення false, навіть якщо він знаходиться в каталозі, зазначеному у змінній PATH. У PowerShell Get-Command
може працювати краще ( stackoverflow.com/questions/11242368/… ), але враховуйте , що для PowerShell поточний каталог не в шляху.
(Get-Command ".\notepad", "notepad" -ErrorAction Ignore -CommandType Application) -ne $null
поверне true, якщо знайдено локально або в шляху.
Для тих, хто шукає варіант PowerShell. Ви можете використовувати Get-Command
командлет, передаючи два елементи. Спочатку вкажіть поточне місце розташування каталогу із .\
префіксом, а потім просто ім’я exe.
(Get-Command ".\notepad", "notepad" -ErrorAction Ignore -CommandType Application) -ne $null
Це поверне істину, якщо знайдено локально або в загальносистемних шляхах.