Проблема с процессом, использующим & && - PullRequest
0 голосов
/ 21 марта 2012

У меня есть внешнее приложение с несколькими аргументами, которые мне нужны для программного запуска. Все это отлично работает в командной строке, но когда я пытаюсь запустить те же аргументы из приложения .Net, это не удается. Теперь я узнал, что использование '&&' делает беспорядок в тот момент, когда некоторые аргументы приводят.

Чтобы упростить мой вопрос, скажите, что у меня есть что-то подобное в моей командной строке:

"Notepad.exe C:\tmp\tmp.txt && Notepad.exe c:\tmp\tmp2.txt"

Это отлично работает. Моя попытка получить эквивалент выглядит следующим образом:

string app = "Notepad.exe";
string args = @"C:\tmp\tmp.txt && Notepad.exe c:\tmp\tmp2.txt";
using (Process process = new Process())
{
    process.StartInfo = new ProcessStartInfo(app, args)
    {
        UseShellExecute = false,
        CreateNoWindow = false,
    };

    process.Start();
    process.WaitForExit();
}

Но это, очевидно, не работает. Является ли мой единственный вариант разделить аргументы по '&&' и запустить их один за другим, или есть способ заставить это работать?

Ответы [ 2 ]

3 голосов
/ 21 марта 2012

Попробуйте это:

string args = @"C:\tmp\tmp.txt && Notepad.exe c:\tmp\tmp2.txt";

Причина в том, что \ запускает escape-последовательность, то есть текст, который вы передаете в качестве аргументов, действительно такой:

C:    mp    mp.txt && Notepad.exe c:    mp    mp2.txt

\tявляется escape-последовательностью для табуляции.

Единственная разница между моим кодом и вашим - это @ перед строкой.Это говорит компилятору интерпретировать строку буквально.Если вам нужно узнать больше, имя для этого - «дословная строка».


ОБНОВЛЕНИЕ:
Вы можете использовать этот код:

string app = "cmd";
string args = @"/c Notepad.exe C:\tmp\tmp.txt && Notepad.exe c:\tmp\tmp2.txt";
using (Process process = new Process())
{
    process.StartInfo = new ProcessStartInfo(app, args)
    {
        UseShellExecute = false,
        CreateNoWindow = true,
    };

    process.Start();
    process.WaitForExit();
}

Он будет использовать cmd.exe для выполнения составной команды.Я изменил CreateNoWindow на true, чтобы не показывать окно командной строки, а только окна блокнота.

0 голосов
/ 21 марта 2012

Есть метод:

   private void RunAndWait(string app, params string[] args)
   {
       foreach (string arg in args)
       {
           Process proc = new Process
                          {
                              StartInfo = new ProcessStartInfo(app, arg)
                                              {
                                                  UseShellExecute = false,
                                                  CreateNoWindow = true
                                              }
                          };

           proc.Start();
           proc.WaitForExit();
       }
   }

И тогда код очень прост:

   string app = "Notepad.exe";
   string args1 = @"C:\tmp\tmp.txt";
   string args2 = @"C:\tmp\tmp2.txt";
   RunAndWait(app, args1, args2);

И обобщить для более чем двух файлов (аргументов):

   string[] args = new string[] {@"C:\tmp\tmp.txt", @"C:\tmp\tmp2.txt", ...}
   RunAndWait(app, args);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...