Member 12885549 Ответов: 2

Запустите файл .bat из cmd.exe в C# с различными аргументами


Я весь день пытался запустить процесс, который запускал бы следующий код:

C:\bin\ant.bat -f=C:\build.xml -DinputFile=C:\Desktop\Book1.xml -DstartDate=2018-06-20 -DxslFile=ProcessingDate -DoutputFile=fff


и он прекрасно работает в cmd.

Что я уже пробовал:

это мой последний код на C#, который, как я действительно надеялся, будет работать, но, однако, это не так:

public void run() {
        string antFile = @"C:\ant.bat";
        string build = @"C:\build.xml";
        string inputFile = @"C:\Book1.xml";
        string startDate = "2018-05-23";
        string outputFile = "ff";
        ProcessStartInfo procStartInfo = new ProcessStartInfo("cmd.exe", "/c" + @"C:bin\ant.bat -f=C:\build.xml -DinputFile=C:\Desktop\Book1.xml -DstartDate=2018-06-20 -DxslFile=ProcessingDate -DoutputFile=test0.xsl");
        Process proc = new Process();
        proc.StartInfo = procStartInfo;
        proc.Start();

        ProcessStartInfo procStartInfo2 = new ProcessStartInfo("cmd.exe", "/c" + antFile + "-f=" + build + "-DinputFile=" + inputFile + "-DstartDate=" + startDate + "-DxslFile=" + startDate + "-DoutputFile=" + outputFile);
        Process proc2 = new Process();
        proc2.StartInfo = procStartInfo2;
        proc2.Start();
    }


Во-первых, я попытался просто поместить все из cmd в процесс, но это не сработало, после того как я попытался сделать то, что на самом деле должен: поместить все строковые значения в качестве аргументов, но это тоже не сработало.

Вместо этого я получаю кучу исключений. Я добавляю ссылку на скриншот этих исключений: Скриншот 19 — imgbb.com[^] [^]

У меня буквально нет вариантов, так как я просидел весь день, делая это. Кто-нибудь знает, что это может быть за проблема?

2 Ответов

Рейтинг:
14

Dave Kreskowiak

Вы не обращаете внимания на пробелы между аргументами командной строки.

Ваша собранная командная строка выглядит следующим образом:

cmd.exe /cC:\ant.bat-f=C:\build.xml-DinputFile=C:\Book1.xml-DstartDate=2018-05-23-dXslFile=2018-05-23-DoutputFile=ff

Простое объединение строк вместе не приводит к автоматическому размещению пробелов в соответствующих местах. Вы сами должны это объяснить.

Кроме того, это очень помогает отладке, если вы помещаете строки в переменные вместо того, чтобы непосредственно собирать их в качестве аргумента при вызове функции:
string arguments=$"/c {antFile} -f={build} -DinputFile={inputFile} -DstartDate={startDate} -DxslFile={startDate} -DoutputFile={outputFile}";
ProcessStartInfo procStartInfo2 = new ProcessStartInfo("cmd.exe", arguments);

Узнайте, как использовать отладчик! Это можно было легко найти с помощью всего лишь отладчика и простого наведения мыши на переменную, чтобы увидеть ее содержимое.

Отладчик находится там, чтобы отлаживать вас, и вы понимаете код и то, как он работает.


Рейтинг:
0

Clifford Nelson

Вы действительно должны также создать метод для выполнения процесса. Таким образом, вы можете обернуть его соответствующим образом, а не дублировать код. Вот какой код я нашел и немного изменил:

public static void RunCmd(string executeString)
  {
      ProcessStartInfo processStartInfo = new ProcessStartInfo(executeString);
      processStartInfo.RedirectStandardOutput = true;
      processStartInfo.RedirectStandardError = true;
      processStartInfo.UseShellExecute = false;

      Process process = new Process();
      process.StartInfo = processStartInfo;
      process.Start();
      process.WaitForExit();

      if (process.ExitCode == -1)
          throw new Exception(process.StandardOutput.ReadToEnd());
  }