Laden...

Output von einem CMD Fenster lesen

Erstellt von Roman78 vor 9 Jahren Letzter Beitrag vor 9 Jahren 1.588 Views
R
Roman78 Themenstarter:in
18 Beiträge seit 2015
vor 9 Jahren
Output von einem CMD Fenster lesen

Ich mache irgendwo wieder einen Fehler, bin jetzt schon 3 Stunden beschäftigt aus einer Dosbox die ich öffne, Daten aus zu lesen.

Es geht darum um eine eventuelle Fehlermeldung anzuzeigen. Ich rufe psexec an was wiederum ein andere Programm aufruft mit anderen Benutzerdaten. Dies funktioniert auch ohne probleme, also wenn man die richtigen Daten eingibt. Aber bei falschen Daten blinkt nur kurz das schwarze CMD Schirm auf und sonst passiert nichts. Habe er mit try capture probiert, aber auch wenn die Daten falsch sind wird psexec noch immer ohne Fehler ausgeführt.

Jetzt möchte ich die Daten die psexec ausgibt, einlesen und filtern auf diversen Text. Also wenn der drin steht halt eine Fehlermeldung erzeugen.

Also mit Vitrual Basic habe ich es schon hin bekommen, jetzt möchte ich es aber mit C# auch mal hin bekommen. Auch wenn ich eine MessageBox.Show(result) mache ist diese Leer. Kann es sein das string result = reader.ReadToEnd(); nur die letzte Zeile liest?

Hier mal ein Ausschnitt:

 bool error;
        private void OK_Click(object sender, EventArgs e)
        {
            ProcessStartInfo StartNAV = new ProcessStartInfo();
            StartNAV.FileName = "C:\\Windows\\System32\\psexec.exe";
            StartNAV.UseShellExecute = false;
            StartNAV.RedirectStandardOutput = true;
            StartNAV.Arguments = "diverse Argumente";
            using (Process process = Process.Start(StartNAV))
            using (StreamReader reader = process.StandardOutput)
            {
              string result = reader.ReadToEnd(); 
              error = result.Contains("Anmeldung fehlgeschlagen: unbekannter Benutzername oder falsches Kennwort.");
              if (error == true) MessageBox.Show("error");
              }
              // Close(); 
        }
K
89 Beiträge seit 2013
vor 9 Jahren

Es gibt meiner Meinung nach zwei Möglichkeiten:

  1. Du befindest dich aus irgendeinem Grund bereits am Ende.
  2. Dein Stream ist leer. Vielleicht ist der Prozess noch nicht durchgelaufen und hat deshalb keinen Output? Was sagt der Debugger an der Stelle?
1.696 Beiträge seit 2006
vor 9 Jahren

process.WaitForExit(); abwarten, erst danach den Streamauslesen. Wenn du Fehler auslesen möchtest, muss du noch

StartNAV.RedirectStandardError = true;
...
StreamReader errorReader = process.StandardError;

implementieren.

Grüße

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

R
Roman78 Themenstarter:in
18 Beiträge seit 2015
vor 9 Jahren

Danke, wie es aussieht hat es funktioniert.

Aber wie weiß C# das psexec ein Error statt eines normale output hat?

Auf WaitForExit brauch ich scheinbar nicht zu warten, also auch ohne kommt die Meldung.

Ich bastle mal weiter....

5.299 Beiträge seit 2008
vor 9 Jahren

process.StandardOutput/.StandardError darf eiglich nicht in einen Using-Block.
Weil dein Code hat diesen StreamReader nicht erstellt, also darf dein Code den auch nicht disposen.
Zwar scheints trotzdem zu gehen, aber trotzdem.

Der frühe Apfel fängt den Wurm.

R
Roman78 Themenstarter:in
18 Beiträge seit 2015
vor 9 Jahren

Ich habe es von der dotnerperls.com Seite:

http://www.dotnetperls.com/redirectstandardoutput

5.299 Beiträge seit 2008
vor 9 Jahren

Hmm, also meine Regel ist die folgende, ich finde zwingend logische:

"Bereinige keine Resourcen, die dir nicht gehören."

Daher nehme ich an, dass deiner Quelle da ein Lapsus unterlaufen ist.

Der frühe Apfel fängt den Wurm.

16.834 Beiträge seit 2008
vor 9 Jahren

Das Dispose des Process sollte den Stream automatisch bereinigen, sofern es korrekt implementiert wurde.
Stimme hier ErfinderDesRades zu; man sollte nur die Ressourcen bereinigen, die einem direkt gehören. Ansonsten ist das jeweilige Parent dafür verantwortlich (hier offensichtlich die Klasse Process).