문제

나는 모든 출력 (stdout + stderr)을 리디렉션하려고합니다. 도스 단일 파일로 명령 :

C:\>dir 1> a.txt 2> a.txt
The process cannot access the file because it is being used by another process.

가능합니까, 아니면 두 개의 별도 파일로 리디렉션해야합니까?

도움이 되었습니까?

해결책

당신은 원합니다 :

dir > a.txt 2>&1

구문 2>&1 리디렉션됩니다 2 (stderr)까지 1 (Stdout). 리디렉션하여 메시지를 숨길 수도 있습니다 NUL, MSDN에 대한 더 많은 설명과 예.

다른 팁

Anders Lindahl의 답변은 정확하지만 stdout을 파일로 리디렉션하고 stderr를 리디렉션하려면이를 확인해야합니다. 2>&1 지정됩니다 후에 그만큼 1> 리디렉션하면 그렇지 않으면 작동하지 않습니다.

REM *** WARNING: THIS WILL NOT REDIRECT STDERR TO STDOUT ****
dir 2>&1 > a.txt

올바른 방법 : dir > a.txt 2>&1. 추가하려면 사용합니다 >>.

MSKB의 배경 정보

이 질문에 대한 받아 들여진 대답은 정확하지만 실제로 설명하는 것은별로 많은 일을하지 않습니다. 그것은 작동하며 구문이 즉시 명확하지 않기 때문에 실제로 무슨 일이 일어나고 있는지 알아 내기 위해 빠른 Google을 수행했습니다. 이 정보가 다른 사람들에게 도움이되기를 희망하면서 여기에 게시하고 있습니다.

가져 왔습니다 MS 지원 KB 110930.


MSKB110930에서

명령 프롬프트에서 오류 메시지 리디렉션 : stderr/stdout

요약

'>'기호를 사용하여 응용 프로그램에서 출력을 리디렉션 할 때 오류 메시지는 여전히 화면에 인쇄됩니다. 오류 메시지는 종종 표준 아웃 스트림 대신 표준 오류 스트림으로 전송되기 때문입니다.

콘솔 (명령 프롬프트) 응용 프로그램 또는 명령의 출력은 종종 두 개의 별도 스트림으로 전송됩니다. 일반 출력은 표준 출력 (STDOUT)으로 전송되고 오류 메시지는 표준 오류 (STDERR)로 전송됩니다. ">"기호를 사용하여 콘솔 출력을 리디렉션하면 stdout 만 리디렉션됩니다. stderr를 리디렉션하려면 리디렉션 기호에 대해 '2>'를 지정해야합니다. 이것은 stderr 인 두 번째 출력 스트림을 선택합니다.

예시

명령 dir file.xxx (어디 file.xxx 존재하지 않습니다) 다음 출력을 표시합니다.

Volume in drive F is Candy Cane Volume Serial Number is 34EC-0876

File Not Found

출력을 다시 리디렉션하면 NUL 장치 사용 dir file.xxx > nul, 당신은 다음과 같이 출력의 오류 메시지 부분을 여전히 볼 수 있습니다.

File Not Found

오류 메시지를 다시 리디렉션합니다 NUL, 다음 명령을 사용하십시오.

dir file.xxx 2> nul

또는 출력을 한 장소로 리디렉션하고 오류를 다른 장소로 리디렉션 할 수 있습니다.

dir file.xxx > output.msg 2> output.err

"& 1"명령을 사용하여 STDERR의 출력을 STDOUT로 리디렉션 한 다음 출력을 STDOUT에서 파일로 전송하여 오류 및 표준 출력을 단일 파일에 인쇄 할 수 있습니다.

dir file.xxx 1> output.msg 2>&1

스크립트의 일반 로그 파일에 stdout과 stderr를 추가하려면 :

dir >> a.txt 2>&1

수정, 파일 핸들 1 프로세스의 경우 1은 STDOUT이며 1> 또는에 의해 > (1 명령 통역사 [cmd.exe]는이를 처리한다는 것을 알고 생략 할 수 있습니다). 파일 핸들 2는 STDERR로 방향을 바꿨습니다 2>.

로그 파일을 만드는 데 사용하는 경우 Outut를 _uniquely_named_ (예 : Date and-Time-Stamped) 로그 파일로 보내지 않는 한, 동일한 프로세스를 두 번 실행하면 리디렉션 된 것이 덮어 쓰기 ( 대체) 이전 로그 파일.

그만큼 >> (stdout 또는 stderr의 경우)는 파일을 교체하지 않을 것입니다. 따라서 누적 로그 파일을 얻을 수 있으며 프로세스의 모든 실행 결과를 보여줍니다. 일반적으로 더 유용합니다.

행복한 트레일 ...

방금 @anders가 방금 게시했을 때 답을 잘랐지만 ...

Windows 도움말에서 리디렉션을 검색했습니다 (URL MS-ITS : C : Windows help ntcmds.chm ::/redirection.htm).

>> 및 |에 대해 읽고 싶을 수도 있습니다 (파이프)도.

그러나 SDTOUT 및 STDERR의 출력이 POSIX 리디렉션 MERGE 구문을 사용하여 적시 순서대로 라인별로 짜여져 있다는 보장은 없습니다.

애플리케이션이 버퍼링 된 출력을 사용하는 경우, 한 스트림의 텍스트가 버퍼 경계에서 다른 스트림에 삽입 될 수 있으며, 이는 텍스트 라인의 중간에 나타날 수 있습니다.

전용 콘솔 출력 로거 ( 'Lord Mulder'의 "STDOUT/STDERR LOGGER"와 같은)는 그러한 작업에 더 신뢰할 수 있습니다. 보다: Mulder의 OpenSource 프로젝트

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top