2009-03-27 14 views
4
System.Diagnostics.Process proc0 = new System.Diagnostics.Process(); 
proc0.StartInfo.FileName = "cmd"; 
proc0.StartInfo.WorkingDirectory = Path.Combine(curpath, "snd"); 
proc0.StartInfo.Arguments = omgwut; 

Und jetzt einige Hintergrundinformationen ... istAusführen von Cmd-Befehle über .NET?

string curpath = System.IO.Path.GetDirectoryName(Application.ExecutablePath); 

omgwut etwas wie folgt aus:

copy/b a.wav + b.wav + ... + y.wav + z.wav output.wav

Und nichts passiert überhaupt. Offensichtlich stimmt etwas nicht. Ich habe auch versucht, "Kopieren" als ausführbare Datei, aber das funktioniert nicht.

Antwort

16

Versuchen Sie Ihre Argumente prefixing mit /C auf cmd, effektiv cmd /C copy /b t.wav ...

Nach cmd.exe /? mit

/C <command>

aus Trägt die von Zeichenfolge angegebenen Befehl sagen und beendet dann

für Ihren Code, könnte es so etwas wie

// .. 
proc0.StartInfo.Arguments = "/C " + omgwut; 

Hinweise aussehen:

  • Eine gute Möglichkeit zu testen, ob Ihr Befehl tatsächlich funktionieren wird es von einer Eingabeaufforderung wird versuchen . Wenn Sie versuchen, cmd.exe copy ... zu tun, werden Sie sehen, dass die Kopie nicht auftritt.
  • Die Länge der Argumente, die Sie als Argumente übergeben können, ist begrenzt. Von MSDN: "Die maximale Zeichenfolgenlänge ist 2,003 Zeichen in .NET Framework-Anwendungen und 488 Zeichen in .NET Compact Framework-Anwendungen."
  • Sie können den Befehl "shelling out" umgehen, indem Sie die Klassen System.IO verwenden, um die Dateien zu öffnen und manuell zu verketten.
0

Daniels cmd/c Idee wird funktionieren. Beachten Sie, dass die Länge einer Befehlszeile auf maximal 8 KB begrenzt ist. Weitere Informationen finden Sie unter this.

Da Sie sowieso in einer .Net-App sind, ist File.Copy möglicherweise ein wenig einfacher/sauberer als dieser Ansatz.

+0

Er versucht, mehrere Dateien anzuhängen; nicht sicher, ob Sie das mit File.Copy tun können –

4

Probieren Sie es aus, es könnte Ihnen helfen .. Es funktioniert mit meinem Code.

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

// The following commands are needed to redirect the standard output. 
// This means that it will be redirected to the Process.StandardOutput StreamReader. 
procStartInfo.RedirectStandardOutput = true; 
procStartInfo.UseShellExecute = false; 
// Do not create the black window. 
procStartInfo.CreateNoWindow = true; 
// Now we create a process, assign its ProcessStartInfo and start it 
System.Diagnostics.Process proc = new System.Diagnostics.Process(); 
proc.StartInfo = procStartInfo; 
proc.Start(); 
// Get the output into a string 
string result = proc.StandardOutput.ReadToEnd(); 
// Display the command output. 
Console.WriteLine(result); 
    } 
    catch (Exception objException) 
    { 
    // Log the exception 
    } 
+0

Sie sollten ein 'throw;' nach dem Protokollieren der Ausnahme hinzufügen, es sei denn, dieser Code ist auf der obersten Ebene des Programms. Dadurch kann die Ausnahme an die Anrufer weitergegeben werden. –

1

Auch Sie können dies versuchen .. das ist noch besser.

System.Diagnostics.Process proc = new System.Diagnostics.Process(); 

proc.EnableRaisingEvents=false; 
proc.StartInfo.FileName="iexplore"; 
proc.StartInfo.Arguments="http://www.microsoft.com"; 

proc.Start(); 

proc.WaitForExit(); 

MessageBox.Show("You have just visited " + proc.StartInfo.Arguments); 
Verwandte Themen