Ich habe eine C# -Kommandozeilenanwendung, die ich in Windows und unter Mono in Unix ausführen muss. Irgendwann möchte ich einen Subprozess starten, der eine Menge beliebiger Parameter enthält, die über die Befehlszeile übergeben werden. Zum Beispiel:Wie starte ich einen Subprozess in C# mit einem Argv? (Oder wandeln Sie agrv in eine legale Arg-Zeichenfolge um)
Usage: mycommandline [-args] -- [arbitrary program]
Leider nimmt System.Diagnostics.ProcessStartInfo nur eine Zeichenfolge für Argumente. Dies ist ein Problem für Befehle wie:
./my_commandline myarg1 myarg2 -- grep "a b c" foo.txt
In diesem Fall argv wie folgt aussieht:
argv = {"my_commandline", "myarg1", "myarg2", "--", "grep", "a b c", "foo.txt"}
Beachten Sie, dass die Anführungszeichen um „abc“ durch die Schale entfernt, so, wenn ich einfach die Argumente verketten um den aRG-String für Process zu erstellen, erhalte ich:
args = "my_commandline myarg1 myarg2 -- grep a b c foo.txt"
welche nicht das, was ich will.
Gibt es eine einfache Möglichkeit, entweder einen argv zum Unterprozessstart unter C# OR zu übergeben, um einen beliebigen argv in einen String zu konvertieren, der für Windows und Linux Shell zulässig ist?
Jede Hilfe würde sehr geschätzt werden.
Nur ein Hinweis: C# unter Windows hat dieses Problem nicht, da Windows technisch kein argv hat. Die gesamte Befehlszeile wird an den Prozess übergeben, und die Aufteilung der Argumente ist die Aufgabe des neuen Prozesses, nicht des Betriebssystems.Unix verfolgt den umgekehrten Weg: Das Betriebssystem ist dafür verantwortlich, ein Array von Strings zu übergeben, so dass Dinge wie die Platzhaltererweiterung vom aufrufenden Prozess gehandhabt werden können. –
@DanielPryden das ist nicht wahr. Windows-Programme haben eine argv-Liste wie POSIX-Dateien. .Net versteckt diese Liste nur wenig hilfreich. Eher irritierend, wenn Sie mich fragen. – IanNorton
@IanNorton: Im Gegensatz dazu nimmt 'CreateProcess' nur eine einzige Argument-Zeichenfolge. Die Microsoft C-Laufzeit (MSVCRT) analysiert diese Zeichenfolge und stellt sie als argv zur Verfügung, aber für die Verwendung der CRT-Implementierung sind keine Programme erforderlich, und die Analyse, die die CRT durchführt, gibt nicht garantiert die gleiche Menge an Token zurück, die zum Starten verwendet wurden der Prozess. –