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

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.

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



답변

당신이 원하는 :

dir > a.txt 2>&1

구문 2>&12(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


답변

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

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

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

행복한 길 …


답변

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

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

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

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


답변

배치 파일 (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

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