7

我有一个命令行工具,它通常会输出大约 200 多行的输出。我正在寻找出现在此输出末尾的文本。当我将输出重定向到文件时:

C:\> somecommand > results.txt 2>&1

...只有前 100 行左右的输出显示在此文件中。同样,如果我将输出通过管道传输到“findstr”之类的内容中,则接收程序在大约第 100 行之后无法找到或操作任何文本。

shell 的屏幕缓冲区大小设置似乎对可以捕获的行数没有任何影响。

有什么想法吗?对于它的价值,有问题的命令是来自 InstallShield 2012 的 iscmdbld.exe。

我尝试过的其他命令(例如“dir”)不会出现此问题。

只有在 cmd 窗口中运行命令时,才能查看程序的完整输出。

4

4 回答 4

3

不幸的是,我没有安装 InstallShield,所以我很难运行一些测试,但是我遇到了一些程序,这些程序在处理输入和输出时并没有像他们应该做的那样。在正常情况下,“>”应该没有限制,我在 Windows 服务器上经常使用它,该服务器在后台运行 ghostscript 和其他旧的 dos 程序,将输出通过管道传输到文件的唯一方法是使用 > ,有时我有很多 Mb 的文件,所以 200 行确实与当前的 exe 有关系。

我只能建议尝试一些解决方法,例如您可以尝试 tee32,它是一个小型免费软件,可以将所有 dos 屏幕输出捕获到文件中。所以你会在屏幕上看到输出,你也会在文件中看到它。

您可以阅读有关它的更多信息:不幸的是,页面上提到的链接不起作用,但我能够找到它的工作副本这里

我真的希望这能帮助你克服这个问题。

埃米尔

于 2014-02-16T15:26:52.510 回答
2

您的问题的另一种解决方案可能是构建一个 C# 程序来捕获输出并将其发送到文件。

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CaptureCMDOutput
{
    class Program
    {
        static string _Filename = @"sc.exe";
        static string _Arguments = @"query";
        static string _outputfile = @"c:\debug.txt";

        static void Main(string[] args)
        {
            var processStartInfo = new ProcessStartInfo
            {
                FileName = _Filename, // Exe file to run
                Arguments = _Arguments, // Arguments to exe file
                RedirectStandardOutput = true,
                UseShellExecute = false
            };

            var process = Process.Start(processStartInfo);
            process.OutputDataReceived += process_OutputDataReceived;
            process.BeginOutputReadLine();
            process.WaitForExit();
            process.CancelOutputRead();

            Console.ReadKey();
        }

        static void process_OutputDataReceived(object sender, DataReceivedEventArgs e)
        {
            Console.WriteLine(e.Data);

            using (StreamWriter writer = new StreamWriter(_outputfile, true))
            {
                writer.WriteLine(e.Data);
            }
        }


    }
}
于 2014-02-16T20:49:24.403 回答
1

如果它正在写入另一个流,请尝试以下操作:

somecommand > results.txt 2>&1 3>&1 4>&1 5>&1 6>&1 7>&1 8>&1 9>&1

另一种可能性是该工具对部分输出使用直接屏幕写入 - 在 MSDOS 时代,有屏幕阅读 TSR 程序可能会有所帮助。

于 2014-02-15T19:28:42.047 回答
0

另一种方法是附加('>>')而不是重新开始('>')。但是,在不了解您的问题的情况下,我什至无法想到如何生成您所看到的内容。

于 2014-02-13T00:13:01.253 回答