manny1988
Goto Top

C-Sharp Abfrage eines Parameters einer exe

Schönen guten Tag, und danke schon vorweg für die Antworten face-smile

Also ich habe eine Exe die mir den Status eines Programmes abruft. Ich kann also in der CMD eingeben:

\\Server\Order\Programm.exe get /status

In der CMD erscheint dann am Ende "AN" oder "AUS".

Ich möchte diesen Status abrufen, und ihn danach in der registry speichern, in "HKLM\SOFTWARE\Statusprogramm\Status"

Ist es in C# möglich, solche Parameter abzurufen?

Content-Key: 146625

Url: https://administrator.de/contentid/146625

Printed on: April 23, 2024 at 23:04 o'clock

Mitglied: 77559
77559 Jul 10, 2010 at 09:11:52 (UTC)
Goto Top
Hallo Manny,

klar geht das, ich hoffe du kannst Englisch
ProcessStartInfo.RedirectStandardOutput Property

Gruß
LotPings
Member: Manny1988
Manny1988 Jul 10, 2010 at 09:38:11 (UTC)
Goto Top
Ich muss gestehen, ich kann nicht viel damit anfangen. Es soll auf jedenfall eine Consolen Anwendung sein, die einfach nur die Exe ließt, und dann am Ende den Wert in den Regedit einträgt. Tut mir wirklich Leid, ich bin mit meinen Programmierkenntnissen noch nicht so weit, if & else, bischen was mit Schleifen und so Kleinzeug ist einfach, aber bei sowas wird mein Verständnis leider überschritten.

edit:

Also ich habs jetz mal so versucht, wahrscheinlich versteh ich einfach das Prinzip gar nicht und es is deswegen falsch face-smile

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;

namespace Zustand_prüfen
{
class Program
{
static void Main(string args)
{
Process DeepFreeze = new Process();
DeepFreeze.StartInfo.FileName = "\\server\Programme\DFC.exe";
DeepFreeze.StartInfo.Arguments = "get /isfrozen";
DeepFreeze.StartInfo.UseShellExecute = false;
DeepFreeze.StartInfo.RedirectStandardOutput = true;
DeepFreeze.Start();

Console.WriteLine(DeepFreeze.StandardOutput.ReadToEnd());

DeepFreeze.WaitForExit();


}
}
}

Bei dem "\\server\Programme wirft der mir einen Fehler aus, wahrscheinlich weil er nicht damit klar kommt das ich einen Pfad angebe?
Member: perseues
perseues Jul 10, 2010 at 10:01:49 (UTC)
Goto Top
Hallo,

dann vielleicht mit Beispiel aus einem anderen Forum von einem mit gleichem Problem:
www.softgames.de/forum/frage121055.html.

Grüße perseues
Member: Manny1988
Manny1988 Jul 10, 2010 at 12:18:15 (UTC)
Goto Top
Unten ist jetzt mal der Code wie ich ihn jetzt zusammengebastelt hab aus euren Links. Mitlerweile startet das ganze Fehlerfrei, jedoch schließt es sich auch sofort.
Ich sehe nichtmal ob er wenigstens die Information ausgibt die er in der cmd normalerweise ausgeben würde.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;

namespace Zustand_prüfen
{
class Program
{
static void Main(string args)
{
Process p = new Process();

p.StartInfo.FileName = "C:\\DFC.exe";
p.StartInfo.Arguments = "get /isfrozen";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.Start();

Console.WriteLine(p.StandardOutput.ReadToEnd());

p.WaitForExit();


}
}
}
Mitglied: 77559
77559 Jul 10, 2010 at 12:23:04 (UTC)
Goto Top
Hallo Manny,
wenn du Code postest fasse ihn bitte in Code-Tags ein, siehe Formatierungshilfe

Deinen Wissensstand in bezug auf C# konnte man deinem ersten Posting nicht entnehmen.
Der Backslash ist ein Escapezeichen, du musst daher alle Backslash verdoppeln, damit sie ein Literales Backslash ergeben.
DeepFreeze.StartInfo.FileName = "\\\\server\\Programme\\DFC.exe";

Gruß
LotPings
Mitglied: 77559
77559 Jul 10, 2010 at 12:35:57 (UTC)
Goto Top
Zitat von @Manny1988:
Unten ist jetzt mal der Code wie ich ihn jetzt zusammengebastelt hab aus euren Links. Mitlerweile startet das ganze Fehlerfrei,
jedoch schließt es sich auch sofort.
Ich sehe nichtmal ob er wenigstens die Information ausgibt die er in der cmd normalerweise ausgeben würde.
Dann starte die Exe doch in einem CMD Fenster,
oder stelle deine IDE so ein, das das Fenster offenbleibt.

Wenn dich C# vor Probleme stellt, warum nimmst du nicht einfach eine Batch für die an sich triviale Aufgabe?

Gruß
LotPings
Member: Manny1988
Manny1988 Jul 10, 2010 at 12:46:00 (UTC)
Goto Top
 class Program
    {       
        static void Main(string args)
        {
            Process p = new Process();

            p.StartInfo.FileName = "\\\\b7serve\\Programme\\DFC.exe";  
            p.StartInfo.Arguments = "get /isfrozen";  
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardOutput = true;
            p.Start();

            Console.WriteLine(p.StandardOutput.ReadToEnd());

            p.WaitForExit();


        }
    }

Entschuldigung, habe ich wahrlich nicht erwähnt. Also ich bin in Sachen Programmierung kein erfahrener Mensch. Bissel was in Batch, aber das wars auch.

Okay, mit dem Doppel-Backslash ruft er das Programm vom Server ab, jedoch schließt es sich dennoch sofort.
Mitglied: 76109
76109 Jul 10, 2010 at 14:31:36 (UTC)
Goto Top
Hallo Manny1988!

müsste das nicht eher etwas in dieser Art sein?:
 class Program
    {       
        static void Main(string args)
        {
            Process p = new Process();

            p.StartInfo.FileName = "\\\\b7serve\\Programme\\DFC.exe";  
            p.StartInfo.Arguments = "get /isfrozen";  
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardOutput = true;
            p.WaitForExit();

            Console.WriteLine(p.StandardOutput.ReadToEnd());
        }
    }
Wobei die Codezeile 11 den anderen Prozess startet, auf dessen Beendigung wartet und im Anschluß der Std-Out gelesen wird?

Gruß Diete
Mitglied: 77559
77559 Jul 10, 2010 at 17:31:41 (UTC)
Goto Top
Zitat von @76109:
müsste das nicht eher etwas in dieser Art sein?:
snip
Wobei die Codezeile 11 den anderen Prozess startet, auf dessen Beendigung wartet und im Anschluß der Std-Out gelesen wird?
Hallo Dieter,

laut der Info in meinem obigen Link soll diese Reihenfolge mögliche Deadlocks verhindern. (Auch wenn das bei der hier minimalen Ausgabe eher unwahrscheinlich ist.)
The code example avoids a deadlock condition by calling p.StandardOutput.ReadToEnd before p.WaitForExit. A deadlock condition can result if the parent process calls p.WaitForExit before p.StandardOutput.ReadToEnd and the child process writes enough text to fill the redirected stream. The parent process would wait indefinitely for the child process to exit. The child process would wait indefinitely for the parent to read from the full StandardOutput stream.

Gruß
LotPings
Mitglied: 76109
76109 Jul 10, 2010 at 19:27:47 (UTC)
Goto Top
Hallo LotPings!

Mhm, dann hätte ich Deinen Info-Link wohl besser vorher lesen sollenface-smile

Gruß Dieter