2012-07-20 151 views
5

我有一個命令行工具,通常會輸出大約200多行的輸出。我正在查找出現在此輸出結尾處的文本。當我將輸出重定向到一個文件:DOS命令重定向到文件截斷輸出

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

...只有第100行左右的輸出在這個文件中顯示出來。同樣,如果我將輸出傳送到'findstr'之類的東西,接收程序在大約第100行後就無法找到或操作任何文本。

外殼的屏幕緩衝區大小設置似乎對可捕獲的行數沒有任何影響。

任何想法發生了什麼?值得注意的是,該命令是來自InstallShield 2012的iscmdbld.exe。

與我嘗試過的其他命令(如'dir')不會發生此問題。

程序的完整輸出只能在cmd窗口中運行該命令時才能看到。

+0

嘗試重定向在開始時,只是櫃面該命令被處理它作爲參數 - '> RESULTS.TXT 2>&1 somecommand' – SeanC 2012-07-24 21:44:13

+0

嘗試附加的輸出:C:\> somecommand >> RESULTS.TXT 2>&1 – DogLimbo 2013-07-16 17:00:26

+0

我和我自己的Visual C++項目有相同的程序。我的程序輸出在重定向到文件時被截斷。 – Notinlist 2014-02-10 10:33:28

回答

0

另一個方法是追加('>>')而不是開始新鮮('>')。但是,我無法想象如何在不知道更多關於您的問題的情況下生成您所看到的內容。

+0

無法生成小型複製程序。最初的效果是在原來的情況下。在問題的評論中添加更多信息給我的案例。 – Notinlist 2014-02-14 15:00:39

1

在它被寫入到另一個流的情況下,試試這個:

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

另一種可能是,該工具是利用輸出的一部分直接加網寫道 - 在MSDOS天裏,有讀屏TSR計劃可能有所幫助。

2

不幸的是我沒有安裝InstallShield,所以對我來說運行一些測試是相當困難的,但是我有一些程序不像處理輸入和輸出時那樣行事。在正常情況下,「>」應該沒有限制,我在後臺運行ghostscript和其他舊的DOS程序的windows服務器上使用它很多,並且將輸出傳輸到文件的唯一方法是使用> ,有時候我有很多MB的文件,所以200行確實需要對當前的exe文件進行一些操作。

我只能建議嘗試一些解決方法,例如你可以嘗試tee32,這是一個小的免費軟件,它將捕獲所有dos屏幕輸出到一個文件。所以你會看到屏幕上的輸出,你也會把它放在文件中。

你可以閱讀更多關於它:here不幸的是,網頁上提到的鏈接不工作,但我能找到它的工作拷貝:here

我真的希望這將幫助你解決這個問題。

周華健

+0

問題非常棘手。我的程序以一種病態但似乎很好的方式終止。沒有任何錯誤(Win 7 64bit)重定向控制檯。但我非常喜歡這個答案,因爲它可以調試這樣的問題。 – Notinlist 2014-02-17 14:06:21

+1

謝謝。當我大約8-10歲時,我開始使用帶有MS-DOS 5.0和Windows 3.0的計算機,並且DOS和所有小型變通辦法(如640kb RAM)仍然可能是最喜歡的主題,它擁有自己的魔力,我仍然認爲DOS有一些有趣的感覺,你永遠不會在LINUX中獲得任何花哨的Windows。 – 2014-02-17 14:11:11

1

的替代解決方案,您的問題可能會構建一個捕獲輸出並將其發送到一個文件中的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); 
      } 
     } 


    } 
} 
相關問題