배치 파일에서 명령이 인식되는지 확인 존재하는 경우. 예를

프로그램 (예 : javac)을 호출하는 박쥐 스크립트를 작성 중입니다. 간단히하기 위해 명령을 실행하기 전에 명령이 있는지 확인하고 싶습니다. 즉, 명령이 PATH에 존재하는 경우.

예를 들어

if (my_command.exe is a recognized command) then (
  my_command.exe my_args
) else (
  REM Output was probably "'my_command.exe' is not recognized as an internal or external command, operable program or batch file."
  REM Do not run my_command.exe
)

Windows에서이를 수행하는 가장 좋은 방법은 무엇입니까?



답변

WHERE mycommand
IF %ERRORLEVEL% NEQ 0 ECHO mycommand wasn't found

답변

아래 코드는 항상 가비지 출력없이 깨끗하게 실행해야합니다.

javac -version >nul 2>&1 && (
    echo found javac
) || (
    echo fail
)

산출:

found javac

하나의 라이너와 동일한 코드 :

javaz -version >nul 2>&1 && ( echo found javac ) || ( echo fail )

산출:

fail

그 순서의 참고 &&||문제 것으로 보인다. 또한 존재 여부를 테스트하는 명령이 작동하려면 오류 레벨 <= 0으로 리턴해야합니다. 바라건대 명령이 /? 또는 –help 인수 또는 java와 마찬가지로 version info 명령


답변

가장 쉬운 방법은 단순히 명령을 실행하는 것입니다. 물론 임의의 프로세스를 시작하고 싶지 않기 때문에 다른 문제가 있습니다.

for %%x in (my_command.exe) do if not [%%~$PATH:x]==[] set MyCommandFound=1

%PATH%환경 변수로 나열된 경로에서 프로그램을 검색하는 대안입니다 . 본질적으로 순수한 배치 버전입니다 which(1). 더 나아질 수 있지만 본질적으로 이것입니다.


답변

내 상황에 가장 간단한 방법은 || 또는 && 연산자.

my_command.exe -version 2>NUL && echo "my_command exists"

또는

my_command.exe -version 2>NUL || echo "my_command doesn't exist"

답변

아래 버전의 일부 개선 사항. 해당 명령이 존재하는지 테스트하고 불필요한 출력을 억제하십시오.

WHERE scp >nul 2>nul
IF %ERRORLEVEL% EQU 0 ECHO scp found

답변

추가 도구 설치가 필요한 경우 where리소스 키트에 명령이 있습니다. 참조 whereis의 윈도우 상당? .

그렇지 않으면 너무 오래된 Windows 버전의 경우 PATH를 제외하고 Dos 실행 파일 조회cmd 에서 언급했듯이 pure에서 사용할 수 있습니다.


답변

나는 이것이 당신이 찾고있는 것이 아니라는 것을 알고 있지만 약간의 논리 변화로 당신이 원하는 것을 성취해야합니다.

실행되는 모든 명령에는 리턴 코드 (일명 오류 레벨)가 있으며, 리턴 코드가 0이면 명령이 성공적으로 실행 된 것입니다. 리턴 코드가 0보다 크면 문제가 발생한 것입니다.

자세한 내용은 여기 를 참조하십시오.

같은 것-

my_command
if (%ERRORLEVEL% > 0) then (
  REM Output was probably "'my_command.exe' is not recognized as an internal or external command, operable program or batch file.  OR SOMETHING WENT WRONG WITH IT."
  REM Do not run my_command.exe
)