Die UseShellExecuteboolesche Eigenschaft bezieht sich auf die Verwendung der Windows- ShellExecute- Funktion im Vergleich zur CreateProcess- Funktion. Die kurze Antwort lautet: Wenn UseShellExecutetrue, wird die ProcessKlasse die ShellExecuteFunktion verwenden, andernfalls wird sie verwendet CreateProcess.
Die längere Antwort lautet, dass die ShellExecuteFunktion zum Öffnen eines bestimmten Programms oder einer bestimmten Datei verwendet wird. Dies entspricht in etwa der Eingabe des auszuführenden Befehls in den Ausführungsdialog und dem Klicken auf OK. Dies bedeutet, dass er beispielsweise verwendet werden kann:
- Öffnen Sie HTML-Dateien oder das Web mit dem Standardbrowser, ohne wissen zu müssen, um welchen Browser es sich handelt.
- Öffnen Sie ein Word-Dokument, ohne den Installationspfad für Word kennen zu müssen
- Führen Sie einen beliebigen Befehl auf dem aus
PATH
Beispielsweise:
Process p = new Process();
p.StartInfo.UseShellExecute = true;
p.StartInfo.FileName = "www.google.co.uk";
p.Start();
Es ist sehr einfach zu bedienen, vielseitig und leistungsstark, hat jedoch einige Nachteile:
Es ist nicht möglich, die Standard-Eingabe- / Ausgabe- / Fehlerhandles umzuleiten
Es ist unmöglich, Sicherheitsbeschreibungen (oder andere coole Dinge) für den untergeordneten Prozess anzugeben
Es besteht die Möglichkeit, Sicherheitslücken einzuführen, wenn Sie Annahmen darüber treffen, was tatsächlich ausgeführt wird:
// If there is an executable called "notepad.exe" somewhere on the path
// then this might not do what we expect
p.StartInfo.FileName = "notepad.exe";
p.Start();
CreateProcessist eine weitaus präzisere Methode zum Starten eines Prozesses. Sie durchsucht den Pfad nicht und ermöglicht es Ihnen, (unter anderem) die Standardeingabe oder -ausgabe des untergeordneten Prozesses umzuleiten. Der Nachteil von ist CreateProcessjedoch, dass keines der 3 Beispiele, die ich oben gegeben habe, funktioniert (probieren Sie es aus und sehen Sie).
Zusammenfassend sollten Sie UseShellExecutefalse setzen , wenn:
- Sie möchten die Standardeingabe / -ausgabe / -fehler umleiten (dies ist der häufigste Grund).
- Sie möchten den Pfad nicht nach der ausführbaren Datei durchsuchen (z. B. aus Sicherheitsgründen).
Umgekehrt sollten Sie UseShellExecutetrue beibehalten , wenn Sie Dokumente, URLs oder Batchdateien usw. öffnen möchten, anstatt den Pfad zu einer ausführbaren Datei explizit angeben zu müssen.
processStartInfo.RedirectStandardOutput=true, aber es scheint mir, dass Sie die Standardausgabe trotzdem umleiten können, indem Sie dies tunprocess.Arguments= "cmd /c dir >c:\\crp\\a.a". Ebenso können Sie aus einem Dialogfeld "Ausführen"cmd /c dir>c:\crp\a.a