Как вы запускаете программу, которую вы не знаете, где начинаются аргументы?

StackOverflow https://stackoverflow.com/questions/220202

Вопрос

Субъект не говорит много, потому что вопрос в одной строке нелегко задать. Я должен выполнить несколько программ, которые я читаю из реестра. Я должен прочитать с поля, где кто-то сохраняет целые пути и аргументы.
Я использую System.Diagnostics.ProcessStartInfo для установки имени программы и ее аргументов, но я нашел широкий спектр аргументов, которые мне нужно проанализировать, чтобы сохранить исполняемый файл процесса в одном поле и его аргументы в другом.

Есть ли способ просто выполнить всю строку как есть?

Это было полезно?

Решение

Я справился с этим так же, как на приведенном выше плакате, используя cmd.exe с информацией о запуске процесса.

Process myProcess = New Process;
myProcess.StartInfo.FileName = "cmd.exe";
myProcess.StartInfo.Arguments = "/C " + cmd;
myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
myProcess.StartInfo.CreateNoWindow = True;
myProcess.Start();
myProcess.WaitForExit();
myProcess.Close();

cmd / c выполняет команду, а затем завершается. WaitForExit завершит процесс, если он будет выполняться слишком долго.

Другие советы

На самом деле их несколько.

<Ол>
  • Вы можете вызвать cmd.exe с / C [ваша командная строка] в качестве аргументов. Это приводит к тому, что cmd.exe обрабатывает вашу команду и завершает работу.
  • Вы можете записать команду в командный файл и запустить ее.
  • И, конечно, есть подход, который вы сейчас используете, а именно анализ командной строки.

    Когда UseShellExecute 'является не установлено, System.Diagnostics.Process вызывает либо CreateProcess или CreateProcessAsUser для фактического запуска программы (она использует второй один, если вы указываете пользователя / домен / пароль). И оба этих вызова могут принимать команду и файл как один аргумент. Из MSDN:

      

    Параметр lpApplicationName может быть   НОЛЬ. В этом случае имя модуля   должен быть первым белым   маркер с пробелами в   Строка lpCommandLine. ...

    Имя lpApplication сопоставляется с ProcessStartInfo.Filename, а lpCommandLine сопоставляется с аргументами. Так что вы должны просто пойти:

    var processStartInfo = new ProcessStartInfo()
    {
        UseShellExecute = false,
        Arguments = cmd
    };
    Process.Start(processStartInfo);
    
    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top