프로그램 (예 : 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
)