[windows] bat 스크립트로 콘솔 출력을 파일로 에코하고 보내려면 어떻게합니까?

작업을 실행하고 출력을 텍스트 파일로 보내는 배치 스크립트가 있습니다. 콘솔 창에 출력을 표시하는 방법이 있습니까?

예를 들어 :

c:\Windows>dir > windows-dir.txt

dir콘솔 창 에 표시하고 텍스트 파일로 출력하는 방법이 있습니까?



답변

아니요, 순수한 리디렉션을 사용할 수 없습니다.
그러나 tee.bat 와 같은 몇 가지 트릭으로 할 수 있습니다.

나는 리디렉션을 조금 설명하려고합니다.

> file 또는 <file 을 사용하여 10 개의 스트림 중 하나를 리디렉션
합니다. 리디렉션이 명령 전후에있는 경우 중요하지 않으므로이 두 줄은 거의 동일합니다.

dir > file.txt
> file.txt dir

이 예제에서 리디렉션은 1> 의 바로 가기 일 뿐이 므로 스트림 1 (STDOUT)이 리디렉션됩니다.
따라서 2> err.txt 와 같이 숫자를 앞에 추가하여 모든 스트림을 리디렉션 할 수 있으며 한 줄로 여러 스트림을 리디렉션 할 수도 있습니다.

dir 1> files.txt 2> err.txt 3> nothing.txt

이 예제에서 “표준 출력”은 files.txt에 들어가고 모든 오류는 err.txt에 있으며 stream3은 nothing.txt에 들어갑니다 (DIR은 스트림 3을 사용하지 않습니다).
Stream0은 STDIN입니다.
Stream1은 STDOUT
입니다.
Stream2 는 STDERR입니다. Stream3-9는 사용되지 않습니다.

그러나 동일한 스트림을 여러 번 리디렉션하려고하면 어떻게됩니까?

dir > files.txt > two.txt

“하나만있을 수 있습니다”그리고 그것은 항상 마지막 것입니다!
따라서 dir> two.txt와 같습니다.

좋아, 스트림을 다른 스트림으로 리디렉션하는 또 다른 가능성이 있습니다.

dir 1>files.txt 2>&1

2> & 1 리디렉션 stream2 스트림 1 행 및 1> files.txt 리디렉션 모든 files.txt .
순서는 여기서 중요합니다!

dir ... 1>nul 2>&1
dir ... 2>&1 1>nul

다르다. 첫 번째는 모두 (STDOUT 및 STDERR)를 NUL로
리디렉션하지만 두 번째 행은 STDOUT을 NUL로, STDERR을 “빈”STDOUT으로 리디렉션합니다.

한 가지 결론으로, Otávio Décio와 andynormancx의 예제가 작동하지 않는 이유는 분명합니다.

command > file >&1
dir > file.txt >&2

둘 다 stream1을 두 번 리디렉션하려고하지만 “하나만있을 수 있습니다”는 항상 마지막 것입니다.
그래서 당신은 얻을

command 1>&1
dir 1>&2

그리고 첫 번째 샘플에서 stream1을 stream1로 리디렉션하는 것은 허용되지 않습니다 (매우 유용하지는 않습니다).

도움이 되길 바랍니다.


답변

다음 과 같은 방식으로 Windows 버전의 UNIX tee 명령 ( http://unxutils.sourceforge.net 에서 찾음 )을 사용하십시오.

mycommand > tee outpu_file.txt

STDERR 출력도 필요한 경우 다음을 사용하십시오.
2>&1STDOUT에 STDERR 출력 (기본 스트림)을 결합한다.

mycommand 2>&1 | tee output_file.txt


답변

실시간으로 출력이 필요하지 않은 경우 (즉, 프로그램이 출력하는 동안) 추가 할 수 있습니다

type windows-dir.txt

그 줄 후에.


답변

나를 위해 일한 해결책은 다음과 같습니다. dir> a.txt | a.txt를 입력하십시오 .


답변

예, 콘솔 (화면)과 파일에 단일 명령 출력을 표시하는 방법이 있습니다. 귀하의 예를 사용하여 …

@ECHO OFF
FOR /F "tokens=*" %%I IN ('DIR') DO ECHO %%I & ECHO %%I>>windows-dir.txt

상해:

FOR명령은 명령 또는 텍스트의 출력을 변수로 구문 분석하며 여러 번 참조 할 수 있습니다.

와 같은 명령의 경우 DIR /B아래 예와 같이 작은 따옴표로 묶습니다. DIR /B원하는 명령으로 텍스트를 바꾸십시오 .

FOR /F "tokens=*" %%I IN ('DIR /B') DO ECHO %%I & ECHO %%I>>FILE.TXT

텍스트를 표시하려면 아래 예와 같이 텍스트를 큰 따옴표로 묶으십시오.

FOR /F "tokens=*" %%I IN ("Find this text on console (screen) and in file") DO ECHO %%I & ECHO %%I>>FILE.TXT

… 그리고 줄 바꿈으로 …

FOR /F "tokens=*" %%I IN ("Find this text on console (screen) and in file") DO (
  ECHO %%I & ECHO %%I>>FILE.TXT
)

콘솔 (화면)에서만 출력을 원하고 다른 시간은 파일로만 보내고 다른 시간은 둘 다로 보내려면 시간이 아래에 표시된대로 변수를 사용하여 FOR 루프의 “DO”절을 지정하십시오 %TOECHOWHERE%.

@ECHO OFF
FOR %%I IN (TRUE FALSE) DO (
  FOR %%J IN (TRUE FALSE) DO (
    SET TOSCREEN=%%I & SET TOFILE=%%J & CALL :Runit)
)
GOTO :Finish

:Runit
  REM Both TOSCREEN and TOFILE get assigned a trailing space in the FOR loops
  REM above when the FOR loops are evaluating the first item in the list,
  REM "TRUE".  So, the first value of TOSCREEN is "TRUE " (with a trailing
  REM space), the second value is "FALSE" (no trailing or leading space).
  REM Adding the ": =" text after "TOSCREEN" tells the command processor to
  REM remove all spaces from the value in the "TOSCREEN" variable.
  IF "%TOSCREEN: =%"=="TRUE" (
      IF "%TOFILE: =%"=="TRUE" (
          SET TEXT=On screen, and in "FILE.TXT"
          SET TOECHOWHERE="ECHO %%I & ECHO %%I>>FILE.TXT"
        ) ELSE (
          SET TEXT=On screen, not in "FILE.TXT"
          SET TOECHOWHERE="ECHO %%I"
      )
    ) ELSE (
      IF "%TOFILE: =%"=="TRUE" (
          SET TEXT=Not on screen, but in "FILE.TXT"
          SET TOECHOWHERE="ECHO %%I>>FILE.txt"
        ) ELSE (
          SET TEXT=Not on screen, nor in "FILE.TXT"
          SET TOECHOWHERE="ECHO %%I>NUL"
      )
  )
  FOR /F "tokens=*" %%I IN ("%TEXT%") DO %TOECHOWHERE:~1,-1%
GOTO :eof

:Finish
  ECHO Finished [this text to console (screen) only].
  PAUSE


답변

command > file >&1


답변

출력 파일을 바꾸지 않고 추가하려는 경우 사용할 수 있습니다

dir 1>> files.txt 2>> err.txt

또는

dir 1>> files.txt 2>>&1