Запуск команд cmd через .NET? - PullRequest
4 голосов
/ 28 марта 2009
System.Diagnostics.Process proc0 = new System.Diagnostics.Process();
proc0.StartInfo.FileName = "cmd";
proc0.StartInfo.WorkingDirectory = Path.Combine(curpath, "snd");
proc0.StartInfo.Arguments = omgwut;

А теперь немного фона ...

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

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

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

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

Ответы [ 4 ]

16 голосов
/ 28 марта 2009

Попробуйте префикс ваших аргументов к 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, чтобы открыть файлы и объединить их вручную.
4 голосов
/ 25 марта 2010

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

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
  }
1 голос
/ 25 марта 2010

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

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);
0 голосов
/ 28 марта 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...