programing

콘솔 출력을 반향하여 배트 스크립트의 파일로 전송하려면 어떻게 해야 합니까?

abcjava 2023. 4. 26. 22:51
반응형

콘솔 출력을 반향하여 배트 스크립트의 파일로 전송하려면 어떻게 해야 합니까?

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

예:

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

이예표는 "준출이력다"로서.txt,err.은 nothing하지 않습니다txt, 파일 이름 err.txt 파일 이름 stream3은 아무것도 없습니다.txt가 될 것입니다(DIR은 stream3을 사용하지 않습니다).
은 STDIN Stream0입니다.
입니다.
는 STDERR의 STDERR입니다.
스트림 3-9는 사용되지 않습니다.

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

dir > files.txt > two.txt

수 마지막입니다!하나만 있을 수 있다" 그리고 그것은 항상 마지막입니다!
그래서 그것은 dir > 2와 같습니다.txt

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

dir 1>files.txt 2>&1 

&1은 stream2를 stream1 및 1> 파일로 리디렉션합니다.txt는 모든 파일을 리디렉션합니다.txt의
여기는 순서가 중요해요!

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

모든 , NUL 합니다. (STDOUT, STDERR)NUL입니다.
그러나 두 번째 줄은 STDOUT를 NUL로 리디렉션하고 STDERR을 "빈" STDOUT로 리디렉션합니다.

결론적으로 오타비오 데시오와 앤디노르망스의 예가 작동하지 않는 이유는 분명합니다.

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

둘 다 스트림1을 리디렉션하려고 두 번 시도하지만 "하나만 있을 수 있습니다."는 항상 마지막입니다.
그래서 당신은

command 1>&1
dir 1>&2

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

다음과 같은 방법으로 Windows 버전의 UNIX tee 명령(http://unxutils.sourceforge.net 에서 확인할 수 있음)을 사용하면 됩니다.

mycommand > tee outpu_file.txt

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

mycommand 2>&1 | tee output_file.txt

실시간으로 출력이 필요하지 않은 경우(예: 프로그램이 출력을 작성할 때) 추가할 수 있습니다.

type windows-dir.txt

그 다음에

저에게 효과적인 솔루션은 다음과 같습니다. dir > a.txt | type a.txt.

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

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

자세한 설명:

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

를 들어, " 과명경우의령은같다음경우▁for,▁as"와 같습니다.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
)

, 다른 두 시간 합니다. "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

제 선택은 다음과 같습니다.

메시지를 받아 콘솔 및 로그 파일로 보내는 프로세스를 자동화하는 서브루틴을 만듭니다.

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

메시지에 변수를 추가할 경우 서브루틴으로 보내기 전에 따옴표를 제거해야 합니다. 그렇지 않으면 배치가 손상될 수 있습니다.물론 이것은 반향에만 효과가 있습니다.

command > file >&1

출력 파일을 교체하는 대신 추가하려면 다음을 사용할 수 있습니다.

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

또는

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

cmd 화면과 로그의 실시간 출력을 모두 처리할 수 있는 간단한 C# 콘솔을 만들었습니다.

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;
    }
}

.tee

foo | tee xxx.log

그리고 여기 https://github.com/iamshiao/Tee 을 컴파일할 도구가 없을 경우를 대비하여 Tee.exe가 포함된 저장소가 있습니다.

나는 atn의 답변을 좋아하지만, 역시 오픈 소스이고 티 기능만 제공하는 와이티로 다운로드하는 것이 사소하지 않았습니다(unix 유틸리티 세트 전체가 아닌 티만 원하는 경우 유용합니다).Windows 명령 프롬프트 출력 표시에 대한 Davor의 답변과 유닉스 유틸리티에 대한 참조도 찾을 수 있는 파일로 리디렉션을 통해 이 사실을 알게 되었습니다.

"Tomas R"에서 제공하는 솔루션은 OP의 질문에 완벽하게 작동하며 기본적으로 사용할 수 있습니다.

시도: chkdsk c: > 출력.txt | type 출력.txt

이 명령어의 출력에는 파일에 직렬로 출력되는 완료율이 포함되므로 파일이 약간 지저분하게 표시됩니다(즉, 진행됨에 따라 텍스트가 추가됨).STDOUT(화면)로 출력되는 비트에는 이러한 현상이 발생하지 않습니다.리디렉션 없이 동일한 명령만 수행하면 됩니다.

저는 당신이 이것과 같은 것을 원한다고 생각합니다.

echo Your Msg> YourTxtFile.txt

또는 새 줄을 원하는 경우:

echo Your Msg>> YourTxtFile.txt

이러한 명령은 로그에 적합합니다.

참고: 이로 인해 때때로 결함이 발생하여 컴퓨터의 전체 텍스트 파일이 교체될 수 있습니다.

다른 참고:파일이 존재하지 않으면 파일이 생성됩니다.

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

반응형