programing

윈도우즈 cmd stdout 및 stderr을 단일 파일로 리디렉션하는 방법은 무엇입니까?

magicmemo 2023. 5. 16. 22:28
반응형

윈도우즈 cmd stdout 및 stderr을 단일 파일로 리디렉션하는 방법은 무엇입니까?

Windows 명령의 모든 출력(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에서 (stdr)로 ~로 이동합니다.1(stdout). 다으로리하메숨시수있길다습니도로 리디렉션하여 메시지를 숨길 수 있습니다.NUL자세한 설명과 예제는 Microsoft 설명서 페이지 명령 프롬프트에서 오류 메시지 리디렉션: STDERR/STDOUT를 참조하십시오.

Anders Lindahl의 대답은 맞지만 stdout을 파일로 리디렉션하고 stderr도 리디렉션하려면 다음을 확인해야 합니다.2>&1다음 뒤에 지정됩니다.1>리디렉션하지 않으면 작동하지 않습니다.

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

Microsoft 설명서의 배경 정보

이 질문에 대한 수락된 답변은 정확하지만, 왜 그것이 작동하는지 설명하는 것은 별로 도움이 되지 않습니다. 구문이 즉시 명확하지 않기 때문에 저는 실제로 무슨 일이 일어나고 있는지 알아보기 위해 빠른 www 검색을 했습니다.이 정보가 다른 사람들에게 도움이 되기를 바라며, 저는 이 정보를 여기에 올립니다.

Microsoft 설명서 페이지에서 가져온 내용:
프롬프트에서 : 파일: STDERR/STDOUT

요약

때 사용합니다.>기호, 오류 메시지가 여전히 화면에 인쇄됩니다.이는 오류 메시지가 Standard Out 스트림 대신 Standard Error 스트림으로 전송되는 경우가 많기 때문입니다.

콘솔(명령 프롬프트) 응용 프로그램 또는 명령의 출력은 종종 두 개의 개별 스트림으로 전송됩니다.일반 출력은 표준 출력(STDOUT)으로 전송되고 오류 메시지는 표준 오류(STDERR)로 전송됩니다.을 를사하출리경디우는을 때>기호. STDOUT만 리디렉션합니다.STDERR을 STDERR을 .2>연결할 수 있습니다.그러면 두 번째 출력 스트림인 STDERR이 선택됩니다.

dir file.xxx(여기서 파일).에가 표시됩니다.

내 입니다. Fis Candy Cane은 34EC-0876입니다.
Found(파일을(를) 참조하십시오.

를 사용하여 NUL 장치를 사용합니다.dir file.xxx > nul오류 메시지가 계속 표시됩니다.

파일을 찾을 수 없음

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

dir file.xxx 2> nul

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

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

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

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

스크립트의 일반 로그 파일에 stdout 및 stderr를 추가하는 방법

dir >> a.txt 2>&1

맞습니다. 프로세스에 대한 파일 핸들 1은 STDOUT이며, 이 프로세스는 STDOUT로 리디렉션됩니다.1>또는 그에 의하여>(1은 생략할 수 있습니다. 관례에 따라 interpreter [command].exe]이(가) 그것을 처리할 줄 압니다.파일 핸들 2는 STDERR로 리디렉션됩니다.2>.

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

>>(STDOUT 또는 STDERR의 경우) 파일을 대체하지 않고 추가합니다.따라서 프로세스의 모든 실행 결과를 보여주는 누적 로그 파일을 얻을 수 있습니다. 일반적으로 더 유용합니다.

행복한 길...

그러나, 다음과 같은 결과가 나온다는 보장은 없습니다.SDTOUT그리고.STDERR▁the,다▁using▁order를 사용하여 한 엮은 입니다.POSIX리디렉션 병합 구문입니다.

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

로거( 전콘솔출즉로거력용즉(▁(,"StdOut/StdErr Logger"타고'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

물론 원하는 명령을 사용하면 출력이 텍스트 파일로 전송됩니다.방법을 사용하면 신뢰할 수 있지만 화면에 출력이 표시되지 않습니다.

언급URL : https://stackoverflow.com/questions/1420965/how-to-redirect-windows-cmd-stdout-and-stderr-to-a-single-file

반응형