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

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.


답변

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

참조 http://ss64.com/nt/syntax-args.html를


답변

@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 /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!
)