Windows 배치 파일의 % PATH %에 실행 파일이 있는지 테스트하는 방법은 무엇입니까?


90

Windows 배치 파일의 PATH 환경 변수에 실행 파일이 있는지 테스트하는 간단한 방법을 찾고 있습니다.

OS에서 제공하지 않는 외부 도구는 사용할 수 없습니다. 필요한 최소 Windows 버전은 Windows XP입니다.



15
@karlphilip : 물론 아닙니다. 여기서 질문은 아주 다릅니다.
Joey

1
수락 된 답변에 표시해야합니다.
Jeb

답변:


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


1
나는 당신의 접근 방식을 좋아하지만 PATHEXT도 사용하는 정식 버전을 제공 할 수 있다면 더 좋을 것입니다.
sorin 2011 년

4
XP의 경우 루프 스크립트가 필요합니다 (또는 RK에서 where.exe를 다운로드). Vista 및 7은 where.exe와 함께 제공됩니다. 나는 OP가 XP를 구체적으로 말한 것을 알고 있지만, 후손에게 가장 좋은 대답은 항상 사용하는 것 where myExecutable입니다.
라이언 Bemrose

Ryan : 응? 나는 당신의 문장을 분석 할 수 없다고 생각합니다.
Joey

2
저는 배치 스크립팅 초보자이며 %% x의 의미를 잘 모르겠습니다. 내 Windows 7 시스템에서 입력을 시도했습니다. (myExecutable.exe)의 %% X에 대해 수행 (FOUND = %% ~ $ PATH : X 설정) 한 다음 반환을 누르십시오. 나는 응답에서 이것을 얻었다 : C : \ Users \ James> for %% X in (cmd.exe) do (set FOUND = %% ~ $ PATH : X) %% X이 시점에서 예상치 못한 것이 었습니다.
simgineer

3
simengineer : 배치 파일과 명령 줄에서 구문 분석이 다르므로 (배치 파일에 %0– 가 있기 때문에 %9) 두 배로 늘려야 합니다 %. 명령 줄에서는 필요하지 않으므로 for변수는 %x.
Joey

82

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

아주 좋고 간단합니다! 감사!
Pawel Cioch

18

다음은 응용 프로그램 실행을 시도하고 나중에 오류를 처리하는 간단한 솔루션입니다 .

file.exe /?  2> NUL
IF NOT %ERRORLEVEL%==9009 ECHO file.exe exists in path

오류 코드 9009는 일반적으로 파일을 찾을 수 없음을 의미합니다.

유일한 단점은 file.exe발견되면 실제로 실행된다는 것입니다 (어떤 경우에는 바람직하지 않음).


24
는 유일한 단점 (경우에 따라 원치 않는 것입니다)가 실행되는 "file.exe가"입니다
eadmaster

6

이는 매개 변수 대체를 통해 수행 할 수 있습니다.

%~$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를


1
흥미로운 트릭 setlocal이지만 및 을 피하기 위해 해결 방법 for %%X in (myExecutable.exe) do (set FOUND=%%~$PATH:X)으로 for사용되는 한 줄 솔루션입니다 . %%~$PATH:Xcall%~$PATH:1
gavenkoa

0
@echo off
set found=
set prog=cmd.exe
for %%i in (%path%) do if exist %%i\%prog% set found=%%i
echo "%found%"
if "%found%"=="" ....

3
for의 내용을 구문 분석 할만큼 똑똑 하지 않기 때문에 작동 하지 않습니다 PATH. 예를 들어 공백이있는 디렉토리가 누락됩니다. 그리고 for /f함께 사용하더라도 delims=;디렉토리에 a ;가 포함되어 있고 따옴표로 묶 이면 제대로 작동하지 않습니다 .
Joey

@Joey, 문자열 교체는 어떻습니까? 교체 ;와 함께 "; ": set quotedPath="%PATH:;="; "%".
XP1 2012

1
XP1 : 아니요, 여전히 쓸모가 없습니다. "C:\Folder with; semicolon, quoted"경로 에 추가 하여 시도하고 어떤 일이 발생하는지 확인하십시오. 적어도 여기에서는 모든»단어«를 개별적으로 처리하려고합니다. 어떤면에서는 이전의 행동보다 더 나쁩니다.
Joey

0

때로는이 간단한 솔루션이 작동하여 출력이 예상 한 것과 일치하는지 확인합니다. 첫 번째 줄은 명령을 실행하고 표준 출력의 마지막 줄을 가져옵니다.

FOR /F "tokens=*" %%i in (' "xcopy /? 2> nul" ') do SET xcopyoutput=%%i
if "%xcopyoutput%"=="" echo xcopy not in path.

그러나 시스템 환경이 다른 언어를 사용한다면 어떻게 될까요?
Beachwalker

0

시작 폴더에서 나와 같은 것을 검색하는 경우 폴더로 이동해야합니다. 예를 들어 시작 폴더에서 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뿐만 아니라 하나 개의 폴더에 존재

-1

사용 명령 : 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의 경우 현재 디렉터리가 경로에 없다는 점을 고려하십시오.
Ronald Zarīts 2015 년

1
@RonaldZarits가 지적했듯이 전체 PowerShell 지원을 위해 두 가지 옵션과 함께 Get-Command를 사용할 수 있습니다. 먼저 현재 디렉토리 위치를 지정한 다음 exe 이름 만 지정하십시오. (Get-Command ".\notepad", "notepad" -ErrorAction Ignore -CommandType Application) -ne $null로컬 또는 경로에서 발견되면 true를 반환합니다.
John C

-1

PowerShell 옵션을 찾는 사람들을 위해. 당신은 사용할 수 있습니다Get-Command두 항목을 전달 cmdlet을 . 먼저 .\접두사가 있는 현재 디렉토리 위치를 지정한 다음 exe 이름 만 지정하십시오.

(Get-Command ".\notepad", "notepad" -ErrorAction Ignore -CommandType Application) -ne $null

로컬 또는 시스템 전체 경로에서 발견되면 true를 반환합니다.


사용자를 다운 보트하고 실행하는 것보다 더 좋은 것은 없습니다. 동의하지 않고 반대 투표까지 진행하려는 경우 원하는 결과를 얻는 데 좋은 접근 방식이 아니라는 데 동의하지 않는 이유를 설명하는 설명도 추가하십시오.
John C
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.