Запуск cmd в C # - PullRequest
       16

Запуск cmd в C #

0 голосов
/ 10 декабря 2018

Есть ли разница между:

var startInfo = new ProcessStartInfo();
string path = Directory.GetCurrentDirectory() + @"\foldername";
startInfo.WorkingDirectory = path;
startInfo.FileName = path + @"\do_run.cmd";
startInfo.Arguments = "/c arg1 arg2";
Process.Start(startInfo);

и

var startInfo = new ProcessStartInfo();
string path = Directory.GetCurrentDirectory() + @"\foldername";
startInfo.FileName = @"C:\windows\system32\cmd.exe";
startInfo.Arguments = @"/c cd " + path + " && do_run arg1 arg2";
Process.Start(startInfo);

По какой-то причине второй блок кода работает правильно, а первый - нет.

Во-вторых, я не могу использовать свой каталог C: при выпуске приложения, так как мне запустить cmd.exe в папке проекта Visual Studio?

Спасибо

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Что-то вроде этого:

using System.IO;
using System.Reflection;

... 

var startInfo = new ProcessStartInfo();

// We want a standard path (special folder) which is C:\windows\system32 in your case
// Path.Combine - let .Net make paths for you 
startInfo.FileName = Path.Combine(
  Environment.GetFolderPath(Environment.SpecialFolder.System), 
 "cmd.exe");

string path = Path.Combine(
  // If you want exe path; change into 
  //   Environment.CurrentDirectory if you want current directory
  // if you want current directory
  Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), 
 @"foldername");

// ""{path}"" - be careful since path can contain space(s)
startInfo.Arguments = $@"/c cd ""{path}"" && do_run arg1 arg2";

// using : do not forget to Dispose (i.e. free unmanaged resources - HProcess, HThread)
using (Process.Start(startInfo)) {
  ... 
}
0 голосов
/ 10 декабря 2018

Просто используйте cmd.exe:

var startInfo = new ProcessStartInfo();
string path = Directory.GetCurrentDirectory() + @"\foldername";
startInfo.FileName = "cmd.exe";
startInfo.Arguments = @"/c cd " + path + " && do_run arg1 arg2";
Process.Start(startInfo);

Windows по умолчанию включает System32 (где находится cmd.exe) в системную переменную PATH (то есть вы можетезапустите cmd.exe из любого места, и он его найдет).

Относительно того, почему ваш первый код не работает, я не уверен на 100%, но если вы работаете в .NET Core, вы можетенеобходимо установить UseShellExecute на true, поскольку, в отличие от .NET Framework, по умолчанию используется false.Тем не менее, я бы сказал, что выше - лучший вариант.

...