【问题标题】:DOS command redirect to file truncates outputDOS 命令重定向到文件截断输出
【发布时间】:2012-07-20 21:02:46
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • 在开始时尝试重定向,以防命令将其视为参数 - > results.txt 2>&1 somecommand
  • 尝试追加输出:C:\> somecommand >> results.txt 2>&1
  • 我有与我自己的 Visual C++ 项目相同的程序。重定向到文件时,我的程序的输出会被截断。
  • 程序(第一次出现)-> 问题
  • 我的截断输出是 google-test 输出,其中我有 50 多个测试对象,总共有 200 多个测试函数。

标签: redirect buffer dos


【解决方案1】:

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

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

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

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

埃米尔

【讨论】:

  • 这个问题非常棘手。我的程序以一种病态但看似良好的方式终止。重定向控制台没有任何问题(Win 7 64bit)。但我非常喜欢这个答案,因为它让位于调试这样的问题。
  • 谢谢。当我大约 8 到 10 岁时,我开始使用装有 MS-DOS 5.0 和 Windows 3.0 的计算机,不知何故 DOS 和所有这些限制(如 640kb RAM)的小变通方法仍然可能是我最喜欢的主题,它有它自己的魔力,我仍然认为DOS 有一些有趣的感觉,你永远不会在 LINUX 和任何花哨的 Windows 中获得。
【解决方案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);
            }
        }


    }
}

【讨论】:

    【解决方案3】:

    如果它正在写入另一个流,试试这个:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 无法生成小型复制程序。原来的效果在原来的情况下就到位了。在问题的评论中为我的案例添加更多信息。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-07
      • 1970-01-01
      • 1970-01-01
      • 2015-10-30
      • 1970-01-01
      • 2011-10-05
      相关资源
      最近更新 更多