DOS命令重定向到文件会截断输出。

7

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

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

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

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

这里发生了什么?值得一提的是,所涉及的命令是来自InstallShield 2012的iscmdbld.exe。

其他我尝试过的命令(如'dir')不会出现这个问题。

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


尝试在开头进行重定向,以防命令将其视为参数 - > results.txt 2>&1 somecommand - SeanC
尝试将输出附加到文件中:C:> somecommand >> results.txt 2>&1 - DogLimbo
我有自己的 Visual C++ 项目,其中包含同样的程序。当将我的程序重定向到文件时,输出被截断了。 - Notinlist
程序(第一次出现)-> 问题 - Notinlist
我的截断输出是一个 Google 测试输出,其中我有 50 多个测试主题和总共 200 多个测试函数。 - Notinlist
4个回答

3
很不幸,我没有安装InstallShield,所以很难对其进行测试,但我遇到了一些程序在处理输入和输出时没有按照预期的方式运行。在正常情况下,“>”应该没有限制,在运行ghostscript和其他旧dos程序的windows服务器上,我经常使用它,并且将输出导入文件的唯一方法是使用>,有时我可能有几MB大小的文件,所以200行确实与当前exe相关。
我只能建议尝试一些解决方案,例如您可以尝试tee32,这是一个小型免费软件,可以将所有dos屏幕输出捕获到文件中。因此,您将看到屏幕上的输出并将其保存在文件中。
您可以在此处阅读更多信息:这里,不幸的是,页面上提到的链接不起作用,但我能找到一个有效的副本:这里 我真诚地希望这能帮助您解决问题。
Emil

这个问题非常棘手。我的程序以一种不正常但看似良好的方式终止了。重定向控制台没有任何问题(Win 7 64位)。但是我非常喜欢这个答案,因为它提供了解决此类问题的方法。 - Notinlist
1
谢谢。我大约在8-10岁时开始使用MS-DOS 5.0和Windows 3.0的计算机,不知何故,DOS和所有那些限制(如640kb RAM)的小技巧仍然是我最喜欢的主题,它有自己的魔力,我仍然认为DOS有一些有趣的感觉,你永远无法在LINUX或任何花哨的Windows中得到。 - Emil Borconi

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


    }
}

1
如果要写入到另一个流中,请尝试以下方法:
somecommand > results.txt 2>&1 3>&1 4>&1 5>&1 6>&1 7>&1 8>&1 9>&1

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

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

无法生成一个小的复制程序。原始效果在原始情况下仍然存在。在问题的评论中添加更多信息到我的案例。 - Notinlist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接