2012-07-20 11 views
5

Ich habe ein Kommandozeilen-Tool, das in der Regel über 200 Zeilen der Ausgabe ausgibt. Ich suche nach Text, der am Ende dieser Ausgabe erscheint. Wenn ich die Ausgabe in eine Datei umleiten:DOS-Befehl redirect zu Datei truncates Ausgabe

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

... nur die ersten 100 oder so Zeilen der Ausgabe zeigt in dieser Datei auf. Gleichermaßen kann das empfangende Programm nach ungefähr der 100. Zeile keinen Text finden oder bearbeiten, wenn ich die Ausgabe in etwas wie "findstr" pipere.

Die Bildschirmpuffergrößeneinstellungen für die Shell scheinen keinerlei Auswirkung auf die Anzahl der Zeilen zu haben, die erfasst werden können.

Irgendwelche Ideen, was hier vor sich geht? Für das, was es wert ist, ist der Befehl in Frage iscmdbld.exe von InstallShield 2012.

Dieses Problem tritt bei anderen Befehlen, die ich versucht habe (wie "dir") nicht auf.

Die vollständige Ausgabe des Programms kann nur angezeigt werden, wenn der Befehl in einem cmd-Fenster ausgeführt wird.

+0

versuchen, die Umleitung am Start, nur für den Fall der Befehl als Parameter behandelt - '> results.txt 2> & 1 somecommand' – SeanC

+0

Versuchen Sie, die Ausgabe angehängt: C: \> einKommando >> results.txt 2> & 1 – DogLimbo

+0

Ich habe das gleiche Programm mit meinem eigenen Visual C++ - Projekt. Die Ausgabe meines Programms wird abgeschnitten, wenn es in eine Datei umgeleitet wird. – Notinlist

Antwort

0

Ein weiterer Tack ist das Anhängen ('>>') eher neu beginnen ('>'). Ich kann jedoch nicht darüber nachdenken, wie Sie das, was Sie sehen, generieren können, ohne mehr über Ihr Problem zu erfahren.

+0

Fehler beim Erstellen eines kleinen Reproduktionsprogramms. Der ursprüngliche Effekt ist in der ursprünglichen Situation vorhanden. Hinzufügen von mehr Informationen zu meinem Fall im Kommentar der Frage. – Notinlist

1

Falls es auf einem anderen Stream zu schreiben, versuchen Sie dies:

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

Die andere Möglichkeit ist, dass das Werkzeug mit Direktbildschirm schreibt für einen Teil der Ausgabe - in MS-DOS-Tagen gab es Bildschirmlese TSR-Programme, die helfen können.

2

Nun, leider habe ich InstallShield nicht installiert, so dass es ziemlich schwierig für mich sein wird, einige Tests durchzuführen, aber ich habe cam über Programme, die nicht so funktionieren, wie es bei Eingabe und Ausgabe geht. Im Normalfall sollte ">" kein Limit haben, ich benutze es sehr oft auf einem Windows-Server, auf dem ghostscript und andere alte DOS-Programme im Hintergrund laufen und die einzige Möglichkeit, die Ausgabe in eine Datei zu pipen, ist> manchmal habe ich files von ein paar mb, also müssen die 200 linien wirklich etwas mit der aktuellen exe machen.

Ich kann nur vorschlagen, einen Workaround zu versuchen, zum Beispiel können Sie Tee32 versuchen, es ist eine kleine Freeware, die alle DOS-Bildschirmausgabe in eine Datei erfassen wird. So sehen Sie die Ausgabe auf dem Bildschirm und Sie werden es auch in der Datei haben.

Sie können mehr darüber lesen: here leider sind die auf der Seite erwähnt Links funktionieren nicht, aber ich war in der Lage, eine Arbeitskopie davon zu finden: here

ich wirklich hoffe, wird Ihnen helfen, das Problem zu überwinden .

Emil

+0

Das Problem war sehr schwierig. Mein Programm endete krank, aber scheinbar gut. Es gibt nichts falsch (Win 7 64bit) mit Umleiten der Konsole. Aber diese Antwort hat mir sehr gefallen, da sie Probleme wie diese beseitigt. – Notinlist

+1

Danke. Ich begann mit Computern mit MS-DOS 5.0 und Windows 3.0, als ich etwa 8-10 war, und irgendwie DOS und all die kleinen Workarounds diese Einschränkungen (wie 640kb RAM) sind immer noch Lieblings Thema, es hatte seine eigene Magie und ich denke immer noch DOS hat ein interessantes Gefühl, dass man weder LINUX noch irgendein schickes Windows bekommen wird. –

1

Eine alternative Lösung für Ihr Problem könnte ein C# Programm bauen, die die Ausgabe und sendet sie in einer Datei erfasst.

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


    } 
}