Windows 배치 파일의 PATH 환경 변수에 실행 파일이 있는지 테스트하는 간단한 방법을 찾고 있습니다.
OS에서 제공하지 않는 외부 도구는 사용할 수 없습니다. 필요한 최소 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
찾을 수없는 경우 0이 아닌 종료 코드로 반환됩니다. 배치에서는 출력을으로 리디렉션하고 싶을 수도 있습니다 NUL
.
명심하세요
배치 .bat
파일 ( )과 명령 줄 에서 구문 분석하는 방식이 다르므로 (배치 파일에 %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
이는 매개 변수 대체를 통해 수행 할 수 있습니다.
%~$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=;
디렉토리에 a ;
가 포함되어 있고 따옴표로 묶 이면 제대로 작동하지 않습니다 .
;
와 함께 "; "
: 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가 현재 디렉터리에 없으면 PATH 변수에 나열된 디렉터리에 있더라도 false를 반환합니다. PowerShell에서는 Get-Command
더 잘 작동 할 수 있지만 ( stackoverflow.com/questions/11242368/… ) PowerShell의 경우 현재 디렉터리가 경로에 없다는 점을 고려하십시오.
(Get-Command ".\notepad", "notepad" -ErrorAction Ignore -CommandType Application) -ne $null
로컬 또는 경로에서 발견되면 true를 반환합니다.
PowerShell 옵션을 찾는 사람들을 위해. 당신은 사용할 수 있습니다Get-Command
두 항목을 전달 cmdlet을 . 먼저 .\
접두사가 있는 현재 디렉토리 위치를 지정한 다음 exe 이름 만 지정하십시오.
(Get-Command ".\notepad", "notepad" -ErrorAction Ignore -CommandType Application) -ne $null
로컬 또는 시스템 전체 경로에서 발견되면 true를 반환합니다.