오류가 발생했을 때 배치 파일을 어떻게 종료합니까?
다른 매개 변수를 사용하여 동일한 실행 파일을 반복해서 호출하는 배치 파일이 있습니다. 호출 중 하나가 어떤 수준의 오류 코드를 반환하면 즉시 종료합니까?
기본적으로 MSBuild와 동등한 것을 원합니다 ContinueOnError=false
.
을 확인 errorlevel
에 if
다음 문, 및 exit /b
(출구 B의 0이 아닌 값 ATCH 파일 만이 아닌 전체 cmd.exe를 프로세스).
same-executable-over-and-over.exe /with different "parameters"
if %errorlevel% neq 0 exit /b %errorlevel%
오류 수준의 값이 배치 파일 외부로 전파되도록하려면
if %errorlevel% neq 0 exit /b %errorlevel%
그러나 이것이 안에 있다면 for
조금 까다로워집니다. 다음과 같은 것이 더 필요합니다.
setlocal enabledelayedexpansion
for %%f in (C:\Windows\*) do (
same-executable-over-and-over.exe /with different "parameters"
if !errorlevel! neq 0 exit /b !errorlevel!
)
편집 : 각 명령 후에 오류를 확인해야합니다. cmd.exe / command.com 배치에는 전역 "on error goto"유형의 구문이 없습니다. XP 또는 Vista의 배치 해킹에서 부정적인 오류 수준이 발생하지는 않았지만 CodeMonkey 별로 코드를 업데이트했습니다 .
|| goto :label
각 줄에 추가 한 다음을 정의하십시오 :label
.
예를 들어,이 .cmd 파일을 작성하십시오.
@echo off
echo Starting very complicated batch file...
ping -invalid-arg || goto :error
echo OH noes, this shouldn't have succeeded.
goto :EOF
:error
echo Failed with error #%errorlevel%.
exit /b %errorlevel%
배치 파일 서브 루틴 종료에 대한 질문 도 참조하십시오 .
가장 짧은 :
command || exit /b
필요한 경우 종료 코드를 설정할 수 있습니다.
command || exit /b 666
그리고 당신은 또한 기록 할 수 있습니다 :
command || echo ERROR && exit /b
하나의 사소한 업데이트, "오류 수준 1 인 경우"에 대한 검사를 다음과 같이 변경해야합니다.
IF %ERRORLEVEL% NEQ 0
XP에서는 음수를 오류로 얻을 수 있기 때문입니다. 0 = 문제 없음, 다른 문제가 있습니다.
그리고 DOS가 "IF ERRORLEVEL"테스트를 처리하는 방식을 명심하십시오. 확인중인 숫자가 그 숫자 이상이면 true를 반환하므로 특정 오류 번호를 찾고 있다면 255로 시작하여 아래로 내려야합니다.
다음은 일련의 명령을 실행하고 명령이 실패하면 종료되는 BASH 및 Windows CMD 용 폴리 글롯 프로그램 입니다.
#!/bin/bash 2> nul
:; set -o errexit
:; function goto() { return $?; }
command 1 || goto :error
command 2 || goto :error
command 3 || goto :error
:; exit 0
exit /b 0
:error
exit /b %errorlevel%
과거에는 여러 플랫폼 연속 통합 스크립트 에이 유형의 것을 사용했습니다 .
나는 각 명령 뒤에 if를 사용하는 것과는 반대로 가장 읽기 쉬운 OR 형식의 명령을 선호합니다. 그러나 이것을 수행하는 순진한 방법 command || exit /b %ERRORLEVEL%
은 잘못되었습니다 .
이는 배치를 사용할 때가 아니라 행을 처음 읽을 때 변수를 확장하기 때문입니다. 즉 command
, 위의 행에서 실패하면 배치 파일이 올바르게 종료되지만 값 %ERRORLEVEL%
이 행의 시작 부분 이었기 때문에 리턴 코드 0으로 종료됩니다 . 분명히 이것은 스크립트에서 바람직하지 않으므로 다음과 같이 지연 확장 을 활성화해야합니다 .
SETLOCAL EnableDelayedExpansion
command-1 || exit /b !ERRORLEVEL!
command-2 || exit /b !ERRORLEVEL!
command-3 || exit /b !ERRORLEVEL!
command-4 || exit /b !ERRORLEVEL!
이 스 니펫은 명령 1-4를 실행하며, 실패 할 경우 실패한 명령과 동일한 종료 코드로 종료됩니다.
외부 프로그램이나 배치 스크립트가 종료 코드를 리턴하지 않기 때문에 ERRORLEVEL에 항상 의존 할 수는 없습니다.
이 경우 일반적인 실패 검사를 다음과 같이 사용할 수 있습니다.
IF EXIST %outfile% (DEL /F %outfile%)
CALL some_script.bat -o %outfile%
IF NOT EXIST %outfile% (ECHO ERROR & EXIT /b)
프로그램이 콘솔에 무언가를 출력하면 우리는 또한 그것을 확인할 수 있습니다.
some_program.exe 2>&1 | FIND "error message here" && (ECHO ERROR & EXIT /b)
some_program.exe 2>&1 | FIND "Done processing." || (ECHO ERROR & EXIT /b)
아무리 노력해도 msbuild가 실패하더라도 오류 수준은 항상 0으로 유지됩니다. 그래서 해결 방법을 작성했습니다.
프로젝트 빌드 및 Build.log에 로그 저장
SET Build_Opt=/flp:summary;logfile=Build.log;append=true
msbuild "myproj.csproj" /t:rebuild /p:Configuration=release /fl %Build_Opt%
빌드 로그에서 "0 Error"문자열을 검색하고 결과를 var로 설정하십시오.
FOR /F "tokens=* USEBACKQ" %%F IN (`find /c /i "0 Error" Build.log`) DO (
SET var=%%F
)
echo %var%
검색 문자열을 포함하는 행 수를 나타내는 마지막 문자를 가져옵니다.
set result=%var:~-1%
echo "%result%"
문자열을 찾을 수 없으면 오류> 0, 빌드 실패
if "%result%"=="0" ( echo "build failed" )
이 솔루션은 배치 파일에서 명령 출력을 변수로 설정하는 방법 에 대한 Mechaflash의 게시물에서 영감을 얻었습니다.
및 https://ss64.com/nt/syntax-substring.html
ERRORLEVEL
원하는 결과를 얻기 위해 사용 하십시오. 에서 두 개의 변수가 있습니다 ERRORLEVEL
프로세스가 실패 또는 성공 여부를 결정 할 명령은, 이러한 변수는 ERRORLEVEL 0
과 ERRORLEVEL 1
(통과 실패에 대한 1, 0). 배치 파일에서 이것이 어떻게 사용되는지에 대한 예는 다음과 같습니다.
echo off
cls
ping localhost
errorlevel 0 goto :good
errorlevel 1 goto :bad
:good
cls
echo Good!
echo[
pause
exit
:bad
cls
echo Bad!
echo[
pause
exit
여기 당신이 그것을 필요로하는 경우에 대한 추가 정보와 링크입니다 : ERRORLEVEL이
@echo off
set startbuild=%TIME%
C:\WINDOWS\Microsoft.NET\Framework\v3.5\msbuild.exe c:\link.xml /flp1:logfile=c:\link\errors.log;errorsonly /flp2:logfile=c:\link\warnings.log;warningsonly || goto :error
copy c:\app_offline.htm "\\lawpccnweb01\d$\websites\OperationsLinkWeb\app_offline.htm"
del \\lawpccnweb01\d$\websites\OperationsLinkWeb\bin\ /Q
echo Start Copy: %TIME%
set copystart=%TIME%
xcopy C:\link\_PublishedWebsites\OperationsLink \\lawpccnweb01\d$\websites\OperationsLinkWeb\ /s /y /d
del \\lawpccnweb01\d$\websites\OperationsLinkWeb\app_offline.htm
echo Started Build: %startbuild%
echo Started Copy: %copystart%
echo Finished Copy: %TIME%
c:\link\warnings.log
:error
c:\link\errors.log
'IT' 카테고리의 다른 글
clang 오류 : 알 수없는 인수 : '-mno-fused-madd'(파이썬 패키지 설치 실패) (0) | 2020.03.27 |
---|---|
RVM과 함께 Lion에서 Ruby를 설치할 수 없음 – GCC 문제 (0) | 2020.03.27 |
jQuery / Javascript로 배열을 구현 하시겠습니까? (0) | 2020.03.27 |
유효한 요청이지만 빈 데이터에 적합한 REST 응답 코드는 무엇입니까? (0) | 2020.03.27 |
문자열에 숫자 만 포함되어 있는지 확인 (0) | 2020.03.27 |