배치 파일에서 명령이 인식되는지 확인


43

프로그램 (예 : 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에서이를 수행하는 가장 좋은 방법은 무엇입니까?


당신은 어떻게 당신의 명령을 "인식"할 것입니까?
Rook

MS-DOS (진정한 DOS)에서는 다소 단순했습니다. c : \ dos에 exe 파일이 있는지 확인했습니다. 그러나 그때조차도 질문은 남아 있습니다.
Rook

혼란을 드려 죄송합니다. 나는 본질적으로 Windows에서 명령 프롬프트를 의미했습니다. "lkajsflksajdfj"를 입력하면 명령이 아님을 감지하고 싶습니다. "notepad.exe"를 입력하면 문제 없습니다.
user46097

답변:


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

10
누군가가 cmd 창 내부의 출력을 원하지 않으면 그냥 >nul 2>nul뒤에 추가 하십시오 mycommand.
Sebastian

1과 2보다 많은 출력 채널이 있으며, 1은 출력 버퍼를 나타내고 2는 오류 버퍼를 나타 내기 때문에 응용 프로그램의 개발 방법에 따라 다르며 Windows와 함께 제공되는 일반적인 앱에서는 작동하지만 특정 CLI 프로그램은 채널 1과 2가 리디렉션 될 때 여전히 텍스트를 던집니다.
ElektroStudios

15

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

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 명령


이 솔루션은 완벽합니다!
robe007

7

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

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

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


1
이것은 완벽합니다. 요청한 것을 정확하게 수행합니다!
Pez Cuckow

3

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

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

또는

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

왜 stdout을 리디렉션하지 않습니까?
Joey

3

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

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

여기서 <my_exe> NUL 2> & 1 || echo my.exe가 존재하지 않습니다 && goto : EOF는 스크립트에서 잘 작동합니다
Robert

주의 : 테스트하려는 파일 이름에 경로 정보가 포함되어 있으면 작동하지 않습니다. 예 : WHERE \Windows\System32\cmd.exe=>INFO: Could not find files for the given pattern(s).
Jonathan Gilbert

1

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

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


응답 주셔서 감사합니다! 불행히도 요구 사항 중 하나는 바닐라 박스 (XP 시스템 포함)에서 실행해야한다는 것입니다. 따라서 옵션이 아닙니다.
user46097

2
Gilles가 제공 한 두 번째 링크에는 FOR을 사용하고 추가 도구를 사용하지 않는 멋진 솔루션이 있습니다.
paradroid

1

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

실행되는 모든 명령에는 리턴 코드 (일명 오류 레벨)가 있으며, 리턴 코드가 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
)

이것은 영리하다, 나는 그것을 좋아한다.
Shinrai

예, 그러나 명령이 발견되지 않으면 2 줄 오류가 발생합니다. 따라서 더 깨끗한 해결책을 찾을 수 있습니다.
djangofan

0

모든 방법이 효과가있을 수 있지만 내장 된 방식은 어떻습니까?

If exists my_command do echo "my_command exists"

"if /?"를 실행하십시오. 자세한 내용은 명령 행에


5
해당 이름의 파일 / 디렉토리가 현재 디렉토리에 있는지 여부 만 확인합니다. 이 이름을 가진 실행 가능한 명령이 존재하는지 여부에 대한 힌트는 많지 않습니다 PATH.
Joey
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.