development

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

big-blog 2020. 6. 29. 07:29
반응형

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명령은 명령 또는 텍스트의 출력을 변수로 구문 분석하며 여러 번 참조 할 수 있습니다.

For a command, such as DIR /B, enclose in single quotes as shown in example below. Replace the DIR /B text with your desired command.

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

For displaying text, enclose text in double quotes as shown in example below.

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

... And with line wrapping...

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

If you have times when you want the output only on console (screen), and other times sent only to file, and other times sent to both, specify the "DO" clause of the FOR loop using a variable, as shown below with %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

If you want to append instead of replace the output file, you may want to use

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

or

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

My option was this:

Create a subroutine that takes in the message and automates the process of sending it to both console and log file.

setlocal
set logfile=logfile.log

call :screenandlog "%DATE% %TIME% This message goes to the screen and to the log"    

goto :eof

:screenandlog
set message=%~1
echo %message% & echo %message% >> %logfile%
exit /b

If you add a variable to the message, be sure to remove the quotes in it before sending it to the subroutine or it can screw your batch. Of course this only works for echoing.


I like atn's answer, but it was not as trivial for me to download as wintee, which is also open source and only gives the tee functionality (useful if you just want tee and not the entire set of unix utilities). I learned about this from davor's answer to Displaying Windows command prompt output and redirecting it to a file, where you also find reference to the unix utilities.


I made a simple C# console which can handle real-time output to both cmd screen and log

class Tee
{
    static int Main(string[] args)
    {
        try
        {
            string logFilePath = Path.GetFullPath(args[0]);

            using (StreamWriter writer = new StreamWriter(logFilePath, true))
            {
                for (int value; (value = Console.In.Read()) != -1;)
                {
                    var word = Char.ConvertFromUtf32(value);
                    Console.Write(word);
                    writer.Write(word);
                }
            }
        }
        catch (Exception)
        {
            return 1;
        }
        return 0;
    }
}

The batch file usage is the same as how you use Unix tee

foo | tee xxx.log

And here is the repository which includes the Tee.exe in case you don't have tool to compile https://github.com/iamshiao/Tee


The solution provided by "Tomas R" works perfect for the OP's question and it natively available.

Try: chkdsk c: > output.txt | type output.txt

The output is of this command involves a completion percentage that gets serially output to the file hence it will look a bit messy (i.e. the text will be appended as it progress). This does not happen to the bits that gets output to STDOUT (the screen). It is how it would be if you just do the same command without redirection.

참고URL : https://stackoverflow.com/questions/503846/how-do-i-echo-and-send-console-output-to-a-file-in-a-bat-script

반응형