2016-05-31 5 views
2

Ich versuche, ein Befehlszeilenprogramm mit Parametern aus C# auszuführen. Ich hätte mir gedacht, dass es in C# trivial wäre, dies zu tun und dies möglich zu machen, aber es stellte sich herausfordernd heraus, selbst mit all den Ressourcen, die auf dieser Seite und darüber hinaus verfügbar waren. Ich bin ratlos, also werde ich so viel Details wie möglich zur Verfügung stellen.Ausführen der Befehlszeile .exe mit Parametern in C#

Mein aktueller Ansatz und Code ist unten und im Debugger hat der Variablenbefehl den folgenden Wert.

Das Problem kann sein, wie ich rufe und formatiere die Zeichenfolge, die ich in diesem Variablenbefehl verwende.

Irgendwelche Gedanken zu was könnte das Problem sein?

ProcessStartInfo procStartInfo = new ProcessStartInfo("cmd", "/c " + command); 

    procStartInfo.RedirectStandardOutput = true; 
    procStartInfo.UseShellExecute = false; 
    procStartInfo.CreateNoWindow = true; 
    Process process = new Process(); 
    process.StartInfo = procStartInfo; 
    process.Start(); 
    string result = process.StandardOutput.ReadToEnd(); 
    Console.WriteLine(result); 

Ich bekomme keine Informationen oder Fehler in der Variablen Ergebnis, sobald es abgeschlossen ist.

+1

haben Sie versucht, diesen Befehl in einer Befehlszeile? Vielleicht müssen Sie die Zeichenfolge 'command' in Anführungszeichen setzen. Welchen Fehler bekommst du eigentlich? –

+0

Ich kann den genauen Befehl in der Befehlszeile erfolgreich ausführen. Vielleicht unterscheiden sich diese Schritte geringfügig, weil ich das Verzeichnis auf C: \ Folder1 \ Interfaces \ Folder2 \ Common \ JREbin \ setze und dann keytool.exe -import -noprompt -trustcacerts -alias myserver.us.goodstuff.world -file C: \ ausführen SSL_CERT.cer -storepass changeit -keystore keystore.jks Ich bekomme keinen Fehler, wenn das ausgeführt wird, die Konsolenzeichenfolge ist leider leer. –

Antwort

8

Warten Prozess zu beenden (lassen seine Arbeit tun):

ProcessStartInfo procStartInfo = new ProcessStartInfo("cmd", "/c " + command); 

procStartInfo.RedirectStandardOutput = true; 
procStartInfo.UseShellExecute = false; 
procStartInfo.CreateNoWindow = true; 

// wrap IDisposable into using (in order to release hProcess) 
using(Process process = new Process()) { 
    process.StartInfo = procStartInfo; 
    process.Start(); 

    // Add this: wait until process does its work 
    process.WaitForExit(); 

    // and only then read the result 
    string result = process.StandardOutput.ReadToEnd(); 
    Console.WriteLine(result); 
} 
+0

Nach einigem Basteln und Fingerfummeln habe ich das inklusive Konsolenfenster zum Laufen gebracht. Danke für die schnelle Antwort. –

+0

Verwenden Sie Ihren Code Ich bin nicht in der Lage, keystore.jks Datei zu generieren und keinen Fehler zu erhalten. – Hkachhia

+0

@Hkachhia: Versuchen Sie mit * absoluten Pfad *: anstelle von '... -keystore keystore.jks' setzen Sie etwas wie' ... -keystore c: \ mydir \ keystore.jks', und überprüfen Sie, ob Sie 'c: \ mydir \ keystore.jks' Datei erstellt –

0

Ich erkannte ich einige Details ausgelassen haben, dass einige Leute dies in der Zukunft lösen müssen können.

Hier sind die Werte der Methodenparameter zur Laufzeit. Ich hatte etwas Verwirrung darüber, was das Objekt ProcessStartInfo und Process benötigt, um richtig aufzustehen. Ich denke, andere könnten es auch.

EXEDIR = "C: \ folder1 \ folder2 \ bin \ keytool.exe"

args = "-delete -noprompt -alias server.us.goodstuff.world -storepass changeit -keystore keystore.jks"

public bool ExecuteCommand(string exeDir, string args) 
{ 
    try 
    { 
    ProcessStartInfo procStartInfo = new ProcessStartInfo(); 

    procStartInfo.FileName = exeDir; 
    procStartInfo.Arguments = args; 
    procStartInfo.RedirectStandardOutput = true; 
    procStartInfo.UseShellExecute = false; 
    procStartInfo.CreateNoWindow = true; 

    using (Process process = new Process()) 
    { 
     process.StartInfo = procStartInfo; 
     process.Start(); 

     process.WaitForExit(); 

     string result = process.StandardOutput.ReadToEnd(); 
     Console.WriteLine(result); 
    } 
    return true; 
    } 
    catch (Exception ex) 
    { 
    Console.WriteLine("*** Error occured executing the following commands."); 
    Console.WriteLine(exeDir); 
    Console.WriteLine(args); 
    Console.WriteLine(ex.Message); 
    return false; 
    } 

Zwischen Dmitry Unterstützung und der folgenden Ressource,

http://www.codeproject.com/Articles/25983/How-to-Execute-a-Command-in-C

ich konnte dies zusammen schustern. Vielen Dank!

+0

Für diejenigen, die herausgefunden haben, dass ich versuche, ein Zertifikat in einem JRE Keystore zu installieren, hier ist der Import-Befehl, den ich verwende, "-import -noprompt -trustcacerts -alias server.us.goodstuffworld -file C: \ folder1 \\ mycertname.cer -storepass changeit -keystore keystore.jks " –

0

Wenn es um die Ausführung von CLI-Prozessen aus C# geht, mag es eine einfache Aufgabe sein, aber es gibt einige Fallstricke, die Sie vielleicht erst viel später bemerken. Zum Beispiel funktionieren beide der gegenwärtig gegebenen Antworten nicht, wenn der Kindprozess genügend Daten in stdout schreibt, wie es here erklärt.

Ich schrieb eine Bibliothek, die das Arbeiten mit CLIs vereinfacht, indem die Process Interaktion vollständig abstrahiert wird, die Lösung der gesamten Aufgabe durch Ausführen einer Methode - CliWrap.

Ihr Code würde dann wie folgt aussehen:

var cli = new Cli("cmd"); 
var output = cli.Execute("/c " + command); 
var stdout = output.StandardOutput; 
Verwandte Themen