[batch-file] Windows 명령 프롬프트 출력 표시 및 파일로 리디렉션

Windows 명령 프롬프트에서 명령 줄 응용 프로그램을 실행하고 출력을 동시에 파일로 표시하고 리디렉션하려면 어떻게해야합니까?

예를 들어, 내가 명령을 실행 하면 결과를 표시하지 않고 dir > test.txt호출 된 파일로 출력을 리디렉션 test.txt합니다.

어떻게 명령 출력 표시 쓸 수 받는 유사한 프롬프트 Windows 명령의 파일로 리디렉션 출력, tee유닉스 명령을?



답변

davor의 답변 을 확장하려면 다음과 같이 PowerShell을 사용할 수 있습니다.

powershell "dir | tee test.txt"

현재 디렉토리에서 exe의 출력을 리디렉션하려는 경우 .\파일 이름 을 사용해야 합니다. 예 :

powershell ".\something.exe | tee test.txt"


답변

출력을 파일로 리디렉션 한 다음 콘솔 로 리디렉션하는 솔루션 / 해결 방법을 찾을 수있었습니다 .

dir > a.txt | type a.txt

여기서 dir 은 출력을 리디렉션해야하는 명령이고 a.txt 는 출력을 저장할 파일입니다.


답변

Unix tee명령 의 Win32 포트 가 있습니다. http://unxutils.sourceforge.net/ 또는 http://getgnuwin32.sourceforge.net/을 참조하십시오.


답변

이것을 확인하십시오 : wintee

cygwin이 필요 없습니다.

그래도 몇 가지 문제가 발생했습니다.

또한 unxutils 에는 tee가 포함되어 있고 cygwin이 필요하지 않기 때문에 unxutils를 확인할 수 있지만 출력 EOL은 UNIX와 유사합니다.

마지막으로 PowerShell이 ​​있으면 Tee-Object를 사용해 볼 수 있습니다. get-help tee-object자세한 내용을 보려면 PowerShell 콘솔에 입력 하십시오.


답변

tori

나는 그것을 발견했다

dir > a.txt | type a.txt

작동하지 않았습니다 (처음 몇 줄의 dir 목록 만-일종의 프로세스 분기점을 의심하고 두 번째 부분은 ‘type’명령이 무서운 목록이 완료되기 전에 종료 되었습니까?) 대신 대신 사용했습니다.

dir > z.txt && type z.txt

순차적 명령, 하나는 두 번째 시작 전에 완료됩니다.


답변

불행히도 그런 것은 없습니다.

Windows 콘솔 응용 프로그램에는 단일 출력 핸들 만 있습니다. (음, 두 가지가 있습니다 STDOUT, STDERR하지만 여기서 중요하지 않습니다) >출력은 일반적으로 파일 핸들에 콘솔 핸들에 기록 리디렉션.

어떤 종류의 멀티플렉싱을 원한다면 출력을 전환 할 수있는 외부 응용 프로그램을 사용해야합니다. 그런 다음이 응용 프로그램은 파일과 콘솔에 다시 쓸 수 있습니다.


답변

간단한 C # 콘솔 응용 프로그램은 트릭을 수행합니다.

using System;
using System.Collections.Generic;
using System.IO;

namespace CopyToFiles
{
    class Program
    {
        static void Main(string[] args)
        {
            var buffer = new char[100];
            var outputs = new List<TextWriter>();

            foreach (var file in args)
                outputs.Add(new StreamWriter(file));

            outputs.Add(Console.Out);

            int bytesRead;
            do
            {
                bytesRead = Console.In.ReadBlock(buffer, 0, buffer.Length);
                outputs.ForEach(o => o.Write(buffer, 0, bytesRead));
            } while (bytesRead == buffer.Length);

            outputs.ForEach(o => o.Close());
        }
    }
}

이를 사용하려면 소스 명령을 프로그램에 파이프하고 출력을 복제하려는 파일의 경로를 제공하십시오. 예를 들면 다음과 같습니다.

dir | CopyToFiles files1.txt files2.txt

dir의 결과를 표시하고 결과를 files1.txt와 files2.txt에 모두 저장합니다.

위의 오류 처리 방식이 많지 않으므로 실제로 여러 파일을 지원하지 않아도됩니다.