2016-04-26 11 views
-2

vorbei Ich habe diesen Code ein Kommandozeilen-App zu starten:Was ist die korrekte Syntax für mehrere Argumente

 private void LaunchCommandLineApp(string latestStudents, string latestTopics) 
    { 
     // Use ProcessStartInfo class 
     ProcessStartInfo startInfo = new ProcessStartInfo(); 
     startInfo.CreateNoWindow = false; 
     startInfo.UseShellExecute = false; 
     startInfo.FileName = "ConsoleApplication2.exe"; 
     startInfo.WindowStyle = ProcessWindowStyle.Hidden; 
     startInfo.Arguments = 

     try 
     { 
      // Start the process with the info we specified. 
      // Call WaitForExit and then the using statement will close. 
      using (Process exeProcess = Process.Start(startInfo)) 
      { 
       exeProcess.WaitForExit(); 
      } 
     } 
     catch 
     { 
      // Log error. 
     } 
    } 

Was ist die korrekte Syntax für das Bestehen latestStudents & latestTopics an der Linie startInfo.Arguments = als Argumente? Ich habe alles versucht, was ich mir vorstellen kann, aber ich verstehe es immer noch nicht!

+2

versuchen Sie genau wie Eingabeaufforderung: startInfo.Arguments = "nextStudents lastTopics"; –

+0

Trennen Sie Ihre Argumente durch Leerzeichen. Hier ist ein Link, der erste tatsächlich, nach dem Googeln https://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.arguments(v=vs.110).aspx –

+0

Haben Sie die Code von _ConsoleApplication2.exe_? Wenn ja, ist es trivial zu sehen, wie die App die übergebenen Argumente erwartet. Wenn nicht, dann sollten Sie zumindest die Dokumentation haben, in der erklärt wird, wie die Argumente in die Befehlszeile geschrieben werden (falls dies möglich ist). Ohne diese Informationen und ohne Ihre gescheiterten Versuche ist jede Antwort eine Vermutung. – Steve

Antwort

0

Arguments ist eine Zeichenfolge, die die documentation nicht hilfreich sagt, wird vollständig von der Zielanwendung interpretiert. Es sagt jetzt, dass .NET-Anwendungen es interpretieren werden, also hängt es wirklich davon ab, welchen Prozess Sie starten.

Die einzige Möglichkeit zu wissen, wie dieser Argumentstring das Richtige für den Prozess macht, an den Sie ihn übergeben möchten, ist herauszufinden, wie dieser Prozess seine Argumente verarbeitet (versuchen Sie, ihn über die Befehlszeile auszuführen) muss experimentieren). Meistens können Sie erwarten, dass sie durch Leerzeichen getrennt sind. Es ist möglich, dass Sie nur so etwas wie (unter der Annahme, C# 6) tun können:

$"{latestStudents} {latestTopics}" 

Aber das könnte nicht funktionieren, je nachdem, was innerhalb dieser Variablen ist. Sie müssen möglicherweise zitiert werden, insbesondere wenn sie selbst Leerzeichen enthalten.

Es gibt wirklich keine definitive Antwort, die ich Ihnen geben kann.

+0

Das hat auch nicht funktioniert. Die Konsolenanwendung akzeptiert die zwei Argumente und zeigt sie als Zeichenfolgen an. Im Wesentlichen, Console.WriteLine (arg [0]); '&' Console.WriteLine (arg [1]); 'aber ich bekomme den Index außerhalb der Grenzen des Array-Fehlers. – Luves2spooge

+0

Ich habe es zur Arbeit gebracht. Es war tatsächlich ein Rundungsfehler in meiner Konsolen-App, nicht wie die Strings übergeben wurden. Vielen Dank! – Luves2spooge

0

Es hängt von dem Programm ab, das die Argumente interpretiert, aber im Allgemeinen, wenn Sie die Argumente mit Leerzeichen trennen, werden sie dem Programm als ein Array von Strings präsentiert.

Zum Beispiel, wenn Sie das Argument Zeichenfolge angeben, wie:

startInfo.Arguments = "one two three \"fo ur\" \"\\\"fi ve\"\\\"" 

Dann, wenn das Programm eine Konsolenanwendung C# ist, wird die Main(string[] args) Methode eine args Array erhalten wie folgt:

args[0] == "one" 
args[1] == "two" 
args[2] == "three" 
args[3] == "fo ur" 
args[4] == "\"fi ve\"" 

Beachten Sie, dass aufeinanderfolgende Leerzeichen wie die in meinem Beispiel zwischen "zwei" und "drei" ignoriert werden.

Beachten Sie auch, dass die Anführungszeichen um "for ur" dafür sorgen, dass sie als einzelnes Argument übergeben werden.

Schließlich, wenn Sie Anführungszeichen als Teil eines Parameters übergeben möchten, müssen Sie sie mit einem umgekehrten Schrägstrich zu entkommen. In C#, natürlich, müssen Sie den Backslash und die Anführungszeichen, so dass anstelle von "\"fi ve\"" in meinem Beispiel, ich habe die selbst-unhandlichen \"\\\"fi ve\"\\\""

+0

"Beachten Sie auch, dass die Zitate rund um" for ur "beibehalten werden" Seit wann? Ich hatte den Eindruck, dass 'args [3]' '' four ur '' wäre. – yaakov

+0

@codran Ich drückte das schlecht aus; jetzt korrigiert. –

0

Process Argumente als String, ähnlich wie wenn Sie übergeben werden, schreiben Ich habe ConsoleApplication2.exe über eine Befehlszeile ausgeführt.

Wenn Sie beispielsweise ein Befehlsfenster in Windows geöffnet haben und etwas wie ConsoleApplication2.exe /help ausführen, würde "/ help" als Befehlsargument übergeben.

Also für Ihren Fall (und es hängt davon ab, wie ConsoleApplication2.exe codiert), sollten Sie so etwas wie tun:

startInfo.Arguments = latestStudents + " " latestTopics; 

... vorausgesetzt, ConsoleApplication2.exe nimmt diese beiden Parameter in dieser Reihenfolge .

+0

Das hat auch nicht funktioniert. Die Konsolenanwendung akzeptiert die zwei Argumente und zeigt sie als Zeichenfolgen an. Im Wesentlichen Console.WriteLine (arg [0]); & Console.WriteLine (arg [1]); aber ich bekomme Index außerhalb der Grenzen des Array-Fehler – Luves2spooge

+0

Sie müssen ConsoleApplication2.exe zu debuggen und sehen, ob es irgendeine Eingabe erhält. 'für (var i = 0; i jkriddle

1

Beispiele:

 ProcessStartInfo startInfo = new ProcessStartInfo("argsecho.exe"); 
     startInfo.WindowStyle = ProcessWindowStyle.Normal; 

     // Start with one argument. 
     // Output of ArgsEcho: 
     // [0]=/a    
     startInfo.Arguments = "/a"; 
     Process.Start(startInfo); 

     // Start with multiple arguments separated by spaces. 
     // Output of ArgsEcho: 
     // [0] = /a 
     // [1] = /b 
     // [2] = c:\temp 
     startInfo.Arguments = "/a /b c:\\temp"; 
     Process.Start(startInfo); 

     // An argument with spaces inside quotes is interpreted as multiple arguments. 
     // Output of ArgsEcho: 
     // [0] = /a 
     // [1] = literal string arg 
     startInfo.Arguments = "/a \"literal string arg\""; 
     Process.Start(startInfo); 

     // An argument inside double quotes is interpreted as if the quote weren't there, 
     // that is, as separate arguments. Equivalent verbatim string is @"/a /b:""string with quotes""" 
     // Output of ArgsEcho: 
     // [0] = /a 
     // [1] = /b:string 
     // [2] = in 
     // [3] = double 
     // [4] = quotes 
     startInfo.Arguments = "/a /b:\"\"string in double quotes\"\""; 
     Process.Start(startInfo); 

     // Triple-escape quotation marks to include the character in the final argument received 
     // by the target process. Equivalent verbatim string: @"/a /b:""""""quoted string"""""""; 
     // [0] = /a 
     // [1] = /b:"quoted string" 
     startInfo.Arguments = "/a /b:\"\"\"quoted string\"\"\""; 
     Process.Start(startInfo); 

Es ist erstaunlich, was man während Googeln für etwas finden ...

This ist die Verbindung I als Quelle für diese oben Codebeispiele verwendet.

+0

Danke, aber ich habe das schon gefunden, aber ich konnte es immer noch nicht zur Arbeit bringen. Dies betrifft nur die Übergabe von tatsächlichen Strings, nicht von Strings, die in einer 'string' Variablen gespeichert sind. – Luves2spooge

+0

Nun, brauchst du noch Hilfe, um das zu lösen? –

+0

Setzen Sie einfach ein Leerzeichen zwischen diese beiden Zeichenfolgen und fügen Sie sie schließlich in Hochkommas ein. –

Verwandte Themen