Windows cmd의 명령 출력을 파일에 쓰기 (비틀기)


9

그래서을 실행하려고 foo.exe하지만 터미널로 출력하지 않고 파일로 출력하고 싶습니다. 달리기 foo.exe > foo.txt는 나를 위해 이것을 달성해야하지만 그렇지 않습니다. exe 파일을 실행하면 출력이 나타납니다. 즉, exe는 잘 작동합니다. 그러나 출력을 파일로 보내려고하면 얻을 수있는 유일한 것은 다음과 같습니다.

'c:/Program' is not recognized as an internal or external command,
operable program or batch file.

단지 나는 파일로 보내려고 할 때 나타납니다. c:\Program Files (x86)\잘못 해석 된 경로 (있는 등) 일 수 있다고 생각 하면서 출력 파일을 다음과 같이 지정하려고 시도 foo.exe > c:\test.txt했지만 여전히 기쁨은 없습니다.

따라서 실행하려고하는 바이너리가 잘못 작성되었다는 것을 제외하고는 이것을 해결하기 위해 할 수있는 일이 있습니까? 단순히 exe를 실행할 때 유효한 출력을 얻지 만 파일로 멋지게 인쇄되지는 않습니다. 분명히 출력이 있습니다. 문제는 그것을 잡을 수있는 방법이 있는지입니다.


프로그램을 간단한 디렉토리 (C : \ Simple 또는 C : \)로 옮기고 거기서 시도하면 어떻게됩니까?
Jan Doggen

답변:


22

사용중인 명령이 실패한 것으로 표시되지 않았습니다. 질문에 표시하면 해결책을 찾기가 더 쉬울 수 있습니다.

나는 당신의 명령이 다음과 같을 것으로 기대합니다 :

C:\>foo.exe|c:\Program Files (x86)\something\test.txt

당신이 받고있는 오류는 약간의 단서입니다.

'c:/Program' is not recognized as an internal or external command, operable program or batch file.

먼저:
... is not recognized as an internal or external command, operable program or batch file.

일반적으로을 |대신 하여 파일로 리디렉션하려고 할 때 발생 합니다 >.

둘째:
'c:/Program' ...

공백이 포함 된 파일 이름 (또는 경로)을 지정할 때는 큰 따옴표 ( "...")로 묶어야합니다 . OS가 리디렉션 할 파일을 결정할 때 인용되지 않은 공간이 있으면 파일 이름 찾기를 중지하기 때문입니다 "c:/Program".

이 시도:

foo.exe>"c:\Program Files (x86)\something\test.txt"



foo.exe의 방법으로 텍스트 파일 에서 출력을 캡처하지 못하면 다른 가능성이 있습니다 ...

프로그램 foo.exeSTDERR대신 출력을 기록 하는 경우 단일 경로 재 지정을 사용하여 STDOUT출력을 foo.exe캡처하지 않습니다 >. 다음과 같이해야합니다.

foo.exe>"c:\Program Files (x86)\something\test.txt" 2>&1



편집하다:

다음은 파일 리디렉션 및 2>&1표기법에 대한 설명입니다 .

프로그램이 터미널에 쓸 때 둘 중 하나에 쓸 수 있습니다 Streams.

  1. 스트림 1로 불린다 STDOUT또는 표준 출력 . 일반적으로 프로그램은 "정상" 출력을 스트림 1에 씁니다 .

  2. 스트림 2는 불린다 STDERR또는 표준 오류 . 일반적으로 프로그램은 "오류" 출력 (오류 및 경고 메시지)을 스트림 2에 씁니다 .

프로그램이 특정 출력을 작성하는지 STDOUT또는 STDERR프로그래머가 결정 하는지 여부와 프로그램 작성 방법. 일부 프로그램은 모든 출력 (정상 출력 및 오류)을로 보내도록 작성되었습니다 STDOUT.

출력 경로 재 지정없이 프로그램을 실행하면 STDOUT출력 또는 STDERR출력 내용을 구분하지 않고 모든 정상 및 오류 출력이 터미널 화면으로 전송됩니다 .

다음과 같이 단일 "정상"리디렉션을 수행하는 >경우 :

foo.exe > "c:\Program Files (x86)\something\test.txt"

파일로 리디렉션 되는 스트림을 지정하지 않았 으므로 스트림 1이 가정됩니다.

다음과 같이 입력 한 것과 같습니다.

foo.exe 1> "c:\Program Files (x86)\something\test.txt"

이것은 명령 인터프리터 ( cmd.exe)에게 STDOUT(스트림 1)에 대한 프로그램 출력을 지정된 파일 이름 으로 캡처하도록 지시합니다 . 1에서이 1>스트림 1을 의미합니다.

이 경우 모든 일반 프로그램이 파일로 캡처되지만 프로그램이 STDERR(스트림 2)에 쓰면 해당 출력이 캡처되지 않고 화면에 표시됩니다. 일반적인 프로그램 출력을 캡처하는 동안 오류가 발생하면 화면에서 볼 수 있도록 일반적으로 "원하는"방법입니다.

"일반"출력을 하나의 파일로 캡처하고 "오류"출력을 다른 파일로 캡처하려면 다음과 같이하십시오.

    foo.exe > "c:\output.txt" 2> "C:\error.txt"
or
    foo.exe 1> "c:\output.txt" 2> "C:\error.txt"

"정상"출력과 "오류"출력을 동일한 파일 로 캡처하려면 다음 같이 지정할 수 있습니다.

foo.exe > "c:\output.txt" 2>&1

이것은 기본적으로이를 지정하는 "단축"방식이며 스트림 1을 지정된 파일로 리디렉션하고 스트림 2를 스트림 1과 동일한 "장소" (파일)로 리디렉션하는 것을 의미합니다 .


편집하다:

Pacerier는 물었다 :

foo.exe> ​​"c : \ output.txt"2> & 1과 foo.exe> ​​"c : \ output.txt"2> "c : \ output.txt"사이에 차이점이 있습니까? 그들은 동일합니까?

짧은 대답 : 당신은 그것들이 동일하다고 생각할 것입니다. 그들은 달라요.

리디렉션을 사용하여 >"filename.ext", 1>"filename.ext"또는 2>"filename.ext"의는 >출력이 기록되도록 새로운 "여기서 filename.ext"라는 이름의 파일입니다. "filename.ext"파일이 이미 존재하면 먼저 삭제됩니다.

따라서 다음을 사용하십시오.

foo.exe> ​​"c : \ output.txt"2> "c : \ output.txt"

두 경로 재 지정이 동일한 파일에 쓰려고하고 파일이 이미있는 경우 모두 삭제하려고하는 "충돌"이 발생합니다. 이로 인해 원하지 않는 동작이 발생할 수 있습니다. 일반적으로 출력 중 하나 또는 다른 하나 또는 둘 다가 완전히 또는 예측 가능하게 캡처되지 않습니다.

실제 결과는 운영 체제 및 버전에 따라 다르며 실행중인 명령에 따라 달라질 수도 있습니다. 일어날 것입니다 :

1 리디렉션 중 하나에 전송 된 출력이 캡처되거나 부분적으로 캡처되고 다른 리디렉션으로 전송 된 출력이 손실됩니다. 2 운영 체제가 명령에 대해 불평하고 출력이 캡처되지 않습니다 (완전히). 3 정의되지 않은 바람직하지 않은 예측할 수없는 동작.

Windows 7 및 Windows Vista / 8 / 10 및 가능하면 Windows XP에서 운영 체제가 명령에 대해 불평하고 명령이 취소됩니다.

예를 들어 (Windows 7) : 이름이 다음 "C:\Temp\emptyfolder"과 같은 폴더가 있고 "nonexistantfile"이라는 파일이 없습니다.

C:\>cd "\Temp\emptyfolder"

C:\Temp\emptyfolder>dir nonexistantfile>output.txt
File Not Found

C:\Temp\emptyfolder>type output.txt
 Volume in drive F is FFFFx1tb
 Volume Serial Number is 4011-A5C6

 Directory of C:\Temp\emptyfolder

C:\Temp\emptyfolder>

이 경우 하나의 리디렉션 ( >output.txt)을 사용 하여 dir명령 의 출력이 파일 :을 캡처 output.txt하고 오류 메시지 File Not Found가 화면에 표시됩니다. 이것은 예상 된 동작입니다.

이제 두 리디렉션 ( "> 파일"과 "2> 파일")을 모두 사용하십시오.

C:\Temp\emptyfolder>dir nonexistantfile>output.txt 2>output.txt
The process cannot access the file because it is being used by another process.
C:\Temp\emptyfolder>type output.txt

C:\Temp\emptyfolder>

이 경우 운영 체제에서 (outout) 파일이 이미 사용 중이라고 불평했습니다. 그리고 "output.txt"파일은 비워지고 (0 바이트) 두 경로 재 지정에 대한 출력이 손실됩니다.

마지막으로 두 가지 리디렉션 ( "> 파일"과 "2> & 1")을 사용하십시오.

C:\Temp\emptyfolder>dir nonexistantfile>output.txt 2>&1

C:\Temp\emptyfolder>type output.txt
 Volume in drive C is CCCCCCCC
 Volume Serial Number is 1234-ABCD

 Directory of C:\Temp\emptyfolder

File Not Found

C:\Temp\emptyfolder>

이 경우 "> file"은 "stream 1"( "표준 출력")의 출력이 파일로 캡처되도록합니다. 그리고 "2> & 1"은 "스트림 2"( "오류 출력")에 대한 출력이 이미 리디렉션 된 "스트림 1"을 통해 전송되고 또한 동일한 파일로 캡처되도록합니다.

순서가 중요하다는 점도 주목할 가치가 있습니다. 이 순서를 반대로 :

dir nonexistant 2>&1 >output.txt

동일하지 않으며 아마도 원하는 결과를 얻지 못할 것입니다.

이 경우 먼저보고 세차 된 "2> & 1"은 "stream 2"( "error output")의 출력이 "stream 1"이 현재 지정된 위치로 리디렉션되도록합니다. moment는 화면 (기본값)입니다. "> file"은 "stream 1"( "표준 출력")의 출력이 파일로 캡처되도록합니다. 최종 결과는 명령의 출력 ( "스트림 1")이 파일로 캡처되지만 오류 출력 ( "스트림 2")은 여전히 ​​파일이 아닌 화면으로 이동한다는 것입니다.


foo.exe>"c:\test.txt"실제로 작동했지만 프로그램 이 중단되었다는 오류가 발생했습니다 (출력은 여전히 ​​있음). 그러나 2>&1충돌 불만이 사라지면서 귀하의 제안이 더 나아 졌습니다. 그것이 무엇을하는지 정교하게 관리 하시겠습니까? 큰 답변에 다시 한번 감사드립니다.
pzkpfw

@ bigbadonk420-의 사용법에 대한 정보를 포함하도록 답변을 업데이트했습니다 2>&1. 파일 "c : \ test.txt"를 검사하면 "충돌 불만" 이 파일에 기록 된 것입니다. 2>&1프로그램 충돌을 일으키거나 막아서는 안되며, 오류 메시지가 표시되는 대신 캡처됩니다.
Kevin Fegan

1
글쎄, 어떤 이유로 그렇습니다.
pzkpfw 2013 년

1
@ bigbadonk420- 'for some reason it does'리디렉션의 영향을받는 방식은 무엇입니까? 를 포함하여 리디렉션 할 때 2>&1오류가 발생하지 않는다고 말하고 있습니까? 오류가 발생하면 어떤 오류 메시지가 표시됩니까?
케빈 Fegan

1
2>&1포함되지 않은 프로그램이 충돌 나는 표준 Windows 대화 상자를 "이 프로그램이 응답을 중지 한"얻는다. 내가 그것을 포함시킬 때, 그것은 포함되지 않습니다. 왜 그런지 모르겠다. 두 경우 모두 출력이 생성됩니다.
pzkpfw
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.