Windows cmd stdout 및 stderr을 단일 파일로 리디렉션


688

DOS 명령 의 모든 출력 (stdout + stderr)을 단일 파일 로 리디렉션하려고 합니다.

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

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


14
TechNet : 명령 리디렉션 연산자 사용 (여기서 답변보다 더 나은 답변)
Martin Prikryl

1
같은 파일을 다시 열 수 없으므로 2> & 1
Luke

답변:


1090

당신이 원하는 :

dir > a.txt 2>&1

구문 2>&12(stderr)을 1(stdout)으로 리디렉션 합니다 . 당신은 또한에 리디렉션하여 메시지를 숨길 수 있습니다 NUL, MSDN에 대한 자세한 설명과 예 .


32
이것에 감사드립니다,이 유닉스 쉘 구문이 DOS에서도 작동한다는 것을 몰랐습니다!
chaindriver

20
이것은 모든 출력을 숨기는 데 좋습니다. net stop w3svc >NUL 2>&1.. 감사합니다!
wasatchwizard

3
@wasatchwizard Ithink 나는 NUL 2> NUL은 괜찮 았는데> 그에 문제가 있었지만
FrinkTheBrave

13
핸들이 있으면 핸들 (예 : 2)과 경로 재 지정 연산자 (예 :>) 사이에 공백이있을 수 없습니다. 그러므로 2> 2.txt작품 (또는 2> &1) 2 > 2.txt은 그렇지 않다. 2 > &1하지 않습니다.
붉은 완두콩

9
나는 너무나 사랑합니다. "아,이 작은 일회성 문제는 한 시간 정도 걸릴 것입니다." 이 답변을 찾는 것 보다이 주석을 입력하는 데 시간이 더 걸렸습니다.
Brandon

195

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

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

10
후에 DelboyJay의 문제점을 파악하는 데 몇 시간이 걸렸습니다! 감사합니다!
Nam G VU

4
2> & 1을 1>보다 먼저 설정해도 의도 한 효과를 얻지 못하는 이유는 어디입니까? 나는 이것이 "cmd"가 경로 재 지정을 지정하는 순서에 따라 두 가지 다른 의미를주는 명령을 구문 분석하는 방식과 관련이 있다고 생각합니다. 그러나 시간이 낭비 될 수 있으므로 배우는 것이 가치가 있다고 생각하기 때문에 어디에서나 의미 규칙이 문서화되어 있습니다.
igbgotiz

12
@igbgotiz 2> & 1은 '스트림 2를 스트림 1로 리디렉션'을 의미합니다. 따라서 먼저 스트림 1을 설정해야합니다.
FrinkTheBrave

3
@FrinkTheBrave 그러나 스트림 1은 명시 적으로 지정되지 않은 경우 표준 출력 (예 : 콘솔)입니다. 그것은 여전히 ​​그것을 imho 설명하지 않습니다.
MarioDS

1
@MDeSchaepmeester, 그렇게하면 dir 2>&1 > a.txt먼저 >스트림 2 (stderr)를 스트림 1 (stdout)로 리디렉션 합니다. 그런 다음 두 항목이 이미 결합 된 후 stdout ( >지정자가없는)을 파일로 리디렉션 합니다. stderr이 다른 곳으로 가고 싶다면 stdout과 먼저 결합 할 수 없습니다.
cp.engr

80

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

29

stdout 및 stderr을 스크립트의 일반 로그 파일에 추가하려면 다음을 수행하십시오.

dir >> a.txt 2>&1

9
>>(가) 파일에 추가 >파일을 덮어 씁니다.
delliottg

13

프로세스의 파일 핸들 1은 STDOUT이며, 1>또는로 리디렉션됩니다 >(일반적으로 명령 인터프리터 [cmd.exe]는이를 처리하는 것으로 알고 있음). 파일 핸들 2는 STDERR이며로 리디렉션됩니다 2>.

로그 파일을 만들기 위해이 파일을 사용하는 경우 _uniquely_named_ (예 : 날짜 및 시간 스탬프) 로그 파일로 출력을 보내지 않는 한 동일한 프로세스를 두 번 실행하면 리디렉션 된 파일을 덮어 씁니다 ( 교체) 이전 로그 파일.

>>(STDOUT 또는 STDERR 중 하나에 대한) APPEND 파일을 대체하지 않습니다. 따라서 누적 로그 파일을 가져와 모든 프로세스 실행 결과를 보여줍니다. 일반적으로 더 유용합니다.

행복한 길 ...


2

의 출력 않는다는 보장하지만, 없다 SDTOUT하고 STDERR사용하여 줄 단위의 적절한 순서를 interweaved하는 POSIX리디렉션 병합 구문.

응용 프로그램에서 버퍼링 된 출력을 사용하는 경우 한 스트림의 텍스트가 버퍼 경계에 다른 스트림의 텍스트가 삽입되어 텍스트 줄의 중간에 나타날 수 있습니다.

전용 콘솔 출력 로거 (즉, "StdOut/StdErr Logger"by 'LoRd MuldeR')는 이러한 작업에보다 안정적 일 수 있습니다.

참조 : MuldeR의 오픈 소스 프로젝트


0

배치 파일 (Windows 7 이상) 에서이 방법이 가장 신뢰할 수 있음을 알았습니다.

Call :logging >"C:\Temp\NAME_Your_Log_File.txt" 2>&1
:logging
TITLE "Logging Commands"
ECHO "Read this output in your log file"
ECHO ..
Prompt $_
COLOR 0F

분명히 원하는 명령을 사용하면 출력이 텍스트 파일로 전달됩니다. 이 방법을 사용하는 것이다 그러나, 화면 출력이없는 신뢰성이 없다.


(기본적으로 몇 년 전에 제공된 동일한 대답). 화면에 출력을 강제로 표시 할 수 있습니다. >con echo This goes to screen사용자 입력에도 유용합니다. >con set /p "var="Input: "참고 : 해당 행은 화면 에만 나타나고 파일로 리디렉션 되지 않습니다 .
Stephan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.