2012-07-20 6 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

+0

は、出力を追加してみます。C:\> somecommand >> RESULTS.TXT 2>&1 – DogLimbo

+0

私は自分のVisual C++プロジェクトと同じプログラムを持っています。私のプログラムの出力は、ファイルにリダイレクトされたときに切り捨てられます。 – Notinlist

答えて

0

もう一つの欠点は、新鮮な( '>')を追加する( '>>')ことです。しかし、あなたの問題についてもっと知らなくても、あなたが見ているものをどのように生成するかを考えることはできません。

+0

小さな再生プログラムの制作に失敗しました。オリジナルの効果は、元の状態にある。質問のコメントに私のケースに情報を追加する。 – Notinlist

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

+1

ありがとうございます。私は約8-10の時にMS-DOS 5.0とWindows 3.0でコンピュータを使い始めました。何とかしてDOSやその小さな回避策(640kb RAMなど)はまだお気に入りのテーマかもしれません。 DOSには、Linuxやどちらの派手なWindowsでも決して得られないという面白い気持ちがあります。 –

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


    } 
} 
関連する問題