C# Prozess Output umleiten

roker002

Commander
Registriert
Dez. 2007
Beiträge
2.074
Eine Frage, kann man den Prozess Output direkt in eine Datei umleiten ohne zuvor den ganzen Stream einzulesen?

Es geht eingetlich darum den xp_cmd_shell zu ersetzen durch die CLR, da die xp einigen Einschränkungen unterliegt!

Code:
        public static void ExecuteCmd(SqlString exe, SqlString ExecString)
        {
            if (ExecString.IsNull)
                ExecString = String.Empty;
            var startInfo = new System.Diagnostics.ProcessStartInfo(exe.Value, String.Concat(ExecString.Value));
            startInfo.CreateNoWindow = false;
            startInfo.UseShellExecute = false;
            startInfo.RedirectStandardOutput = true;
            startInfo.RedirectStandardError = true;
            startInfo.WorkingDirectory = Environment.GetEnvironmentVariable("SystemRoot");

            var process = System.Diagnostics.Process.Start(startInfo);
            process.WaitForExit();
            if (SqlContext.IsAvailable)
            {
                SqlContext.Pipe.Send(process.StandardOutput.ReadToEnd());
                String err = process.StandardError.ReadToEnd();
                if (string.IsNullOrEmpty(err))
                {
                    throw new Exception(err);
                }
            }
            else
            {
                String txt = process.StandardOutput.ReadToEnd();
                Console.WriteLine(txt);
                String err = process.StandardError.ReadToEnd();
                Console.WriteLine(err);
            }
        }

das ganze hat aber einen Hacken. Ich kann den Output nicht über den Prozess, wie im CMD mit ">" in eine Datei umleiten. Das Printen des Outputs dauert viel zu lange, egal ob man den Prozess anzeigen lässt oder nicht.

kann man vielleicht auch einen CMD Aufruf machen? Meine erste Idee war dem xp durch den Shell Aufruf zu ersetzen, aber da akzeptiert er den Paramaeter nicht

"C:\Program Files\Wireshark\tshark" -l -n -r "C:\test\2008_03_29-00h00m00s-full-tu1-600.trc" -R "((gtp.message == 0x10 or gtp.message == 0x11) and not (icmp)) and (ip.src or ip.dst or udp.srcport or udp.dstport or gtp.flags.version or gtp.message or gtp.teid or gtp.seq_number or gtp.tid or gtp.cause or gtp.imsi or gtp.teid_cp or gtp.teid_data or gtp.apn or gtp.msisdn or gtp.mcc or gtp.mnc or e212.mcc or e212.mnc or gtp.ext_rat_type or gtp.ext_imeisv or gtp.user_ipv4)" -T fields -e frame.time_epoch -e ip.src -e ip.dst -e udp.srcport -e udp.dstport -e gtp.flags.version -e gtp.seq_number -e gtp.teid -e gtp.teid_cp -e gtp.teid_data -e gtp.tid -e gtp.imsi -e gtp.msisdn -e gtp.apn -e e212.mcc -e gtp.mnc -e gtp.ext_rat_type -e gtp.ext_imeisv -e gtp.user_ipv4 -e gtp.cause -e gtp.message -E separator=; > "C:\test\2008_03_29-00h00m-tu1-600.dbf"
(nicht auf die Escapezeichen Achten, habe diese extra hier herausgenommen).
Wenn ich jetzt den mit cmd.exe und param "/C " + Quote
bekomme ich einen Fehler
Code:
var startInfo = new System.Diagnostics.ProcessStartInfo("cmd.exe",  "/C "+ param);
C:\Programm Files ist kein Parameter

Kennt sich da jemand aus? Ich meine wie man einen output generiert
 
evtl mal den ganzen Term quoten (param)
Also könnte mir vorstellen, dass es irgendwie mit den Quotes zu tun haben könnte...

Edit: Ok, scheint nicht der Fall zu sein :-)
cmd /c dir /w
funktioniert auch genau so wie es soll...
 
Ich glaube, die Umleitung des output streams per > muss direkt hinter den Befehl kommen, den du aufrufst, also hier direkt hinter tshark (oder auch ganz an den Anfang als Option fürs cmd, am besten beides probieren).

Der andere Fehler kommt daher, dass irgendwo die Anführungszeichen um den Programmpfad verloren gehen und dann die Pfadbestandteile, die durch Leerzeichen getrennt sind, als einzelen Parameter interpretiert werden.

Probier doch einfach mal Process.Start("...\tshark.exe", ">output.txt ... restliche parameter"); ohne den ganzen anderen Kram extra einzustellen.
 
Code:
String strTemp = Path.Combine(Path.GetTempPath(), "temp.bat");
File.WriteAllText(strTemp, param);
var startInfo = new System.Diagnostics.ProcessStartInfo("cmd.exe",  "/C "+ strTemp);
 
cool es funktioniert! Aber es ist eigentlich ein Sicherheitsrisiko wenn man Batch Dateien ausführen lässt...

danke lynxx
 
Alternativ versuch mal:
Code:
var startInfo = new System.Diagnostics.ProcessStartInfo("cmd.exe",  "/S /C "+ param);
und/oder:
Code:
var startInfo = new System.Diagnostics.ProcessStartInfo("cmd.exe",  "/C \""+ param +"\"");
 
Mit den Hochkommas schein die cmd zu schlucken, mit /S funktioniert es aber nicht!
Danke
 

Ähnliche Themen

Zurück
Oben