2009-03-27 3 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; 

А теперь какой-то фон ...Выполнение команд cmd через .NET?

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

omgwut что-то вроде этого:

копия/б a.wav + b.wav + ... + y.wav + z.wav output.wav

И ничего не происходит вообще. Поэтому очевидно, что что-то не так. Я также попробовал «копировать» как исполняемый файл, но это не работает.

ответ

16

Попробуйте предваряя ваши аргументы CMD с /C, эффективно говоря cmd /C copy /b t.wav ...

Согласно cmd.exe /? с использованием

/C <command>

Проводит команду, указанную строку, а затем завершает

Для вашего кода, это может выглядеть как

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

Примечания:

  • Хороший способ проверить, будет ли ваша команда работать будет на самом деле попробовать его из командной строки , Если вы попытаетесь сделать cmd.exe copy ..., вы увидите, что копия не возникает.
  • Ограничения на длину аргументов, которые вы можете передать в качестве аргументов. От MSDN: «Максимальная длина строки - 2,003 символов в приложениях .NET Framework и 488 символов в приложениях .NET Compact Framework».
  • Вы можете обойти командный ход, используя классы System.IO, чтобы открыть файлы и вручную связать их.
0

Daniels cmd/c идея будет работать. Имейте в виду, что существует ограничение на длину командной строки, вероятно, 8k в вашем случае см. this.

Поскольку вы все равно используете приложение .Net, File.Copy может быть немного проще/чище, чем этот подход.

+0

Он пытается добавить несколько файлов; не уверен, можете ли вы сделать это с помощью File.Copy –

4

Попробуйте это, это может вам помочь .. Его работа с моим кодом.

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

. После регистрации исключения вы должны добавить 'throw;', если этот код не находится на верхнем уровне программы. Это позволит исключению распространяться среди вызывающих. –

1

Даже вы можете попробовать это .. это даже лучше.

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);