2012-07-20 12 views
5

Mam narzędzie wiersza poleceń, które zwykle zrzuca ponad 200 wierszy wyjścia. Szukam tekstu, który pojawia się na końcu tego wyjścia. Kiedy przekierowuję dane wyjściowe do pliku:Przekierowanie polecenia DOS do pliku obcina wyjście

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

... w tym pliku pojawia się tylko pierwsze 100 wierszy danych wyjściowych. Podobnie, jeśli wyprowadzę dane wyjściowe do czegoś podobnego do "findstr", program odbierający nie może znaleźć ani obsługiwać żadnego tekstu po około 100 linii.

Ustawienia wielkości bufora ekranu dla powłoki wydają się nie mieć żadnego wpływu na liczbę linii, które można przechwycić.

Jakieś pomysły, co się tutaj dzieje? Dla tego, co jest warte, polecenie to iscmdbld.exe z InstallShield 2012.

Ten problem nie występuje w przypadku innych poleceń, które wypróbowałem (takich jak "dir").

Pełne wyjście z programu można wyświetlić tylko po uruchomieniu polecenia w oknie cmd.

+0

spróbować przekierowanie na początku, tylko okrywać polecenie jest traktowanie go jako parametr - '> results.txt 2> & 1 somecommand' – SeanC

+0

Spróbuj dołączanie wyjście: C: \> somecommand >> results.txt 2> & 1 – DogLimbo

+0

Mam ten sam program z własnym projektem Visual C++. Dane wyjściowe mojego programu zostaną obcięte po przekierowaniu do pliku. – Notinlist

Odpowiedz

0

Innym sposobem jest dołączenie (">>") raczej zacząć od nowa (">"). Jednak nie mogę myśleć, jak wygenerować to, co widzisz, nie wiedząc więcej o Twoim problemie.

+0

Nie można utworzyć małego programu do reprodukcji. Oryginalny efekt występuje w pierwotnej sytuacji. Dodanie więcej informacji do mojej sprawy w komentarzu do pytania. – Notinlist

1

W przypadku, gdy jest pisanie do innego strumienia, spróbuj tego:

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

Inną możliwością jest to, że narzędzie jest za pomocą bezpośredniego ekran-zapisuje na części wyjściu - w MSDOS dni nie czytali ekranem Programy TSR, które mogą pomóc.

2

Niestety nie mam zainstalowanego InstallShield, więc będzie mi ciężko uruchomić test, ale mam programowanie w różnych programach, które nie działają tak, jak powinny, jeśli chodzi o obsługę wejścia i wyjścia. W normalnym przypadku ">" nie powinien mieć limitu NO, używam go dużo na serwerze Windows, na którym działa ghostscript i inne stare programy dos w tle, a jedynym sposobem na wyprowadzenie danych wyjściowych do pliku jest użycie> , czasami mam pliki o kilku Mb, więc 200 linii naprawdę musi coś zrobić z obecnym exe.

Mogę tylko zaproponować obejście problemu, na przykład możesz wypróbować tee32, jest to małe oprogramowanie freeware, które przechwyci wszystkie dane wyjściowe ekranu do pliku. Więc zobaczysz dane wyjściowe na ekranie i będziesz je również zapisywać w pliku.

Możesz przeczytać więcej na ten temat: here niestety linki zamieszczone na stronie nie działa, ale udało mi się znaleźć kopię roboczą nim: here

Naprawdę mam nadzieję, że to pomoże przezwyciężyć ten problem .

Emil

+0

Problem był bardzo trudny. Mój program zakończył się źle, ale pozornie dobrze. Nie ma nic złego (Win 7 64bit) z przekierowaniem konsoli. Ale podobała mi się ta odpowiedź, ponieważ ustępuje ona możliwościom debugowania takich problemów. – Notinlist

+1

Dzięki. Zacząłem używać komputerów z MS-DOS 5.0 i Windows 3.0, gdy miałem około 8 - 10, i jakoś DOS i wszystkie małe obejścia te ograniczenia (jak 640kb RAM) nadal mogą być ulubionym tematem, miał swoją własną magię i wciąż myślę DOS ma interesujące wrażenie, że nigdy nie wejdziesz ani w LINUX, ani w żadne fantazyjne Windows. –

1

Alternatywnym rozwiązaniem problemu może być budowanie program C#, który przechwytuje dane wyjściowe i wysyła go do pliku.

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


    } 
} 
Powiązane problemy