Как вы запускаете программу, которую вы не знаете, где начинаются аргументы?
-
03-07-2019 - |
Вопрос
Субъект не говорит много, потому что вопрос в одной строке нелегко задать.
Я должен выполнить несколько программ, которые я читаю из реестра. Я должен прочитать с поля, где кто-то сохраняет целые пути и аргументы.
Я использую 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 завершит процесс, если он будет выполняться слишком долго.
Другие советы
На самом деле их несколько.
<Ол>И, конечно, есть подход, который вы сейчас используете, а именно анализ командной строки.
Когда UseShellExecute 'является не установлено, System.Diagnostics.Process вызывает либо CreateProcess или CreateProcessAsUser для фактического запуска программы (она использует второй один, если вы указываете пользователя / домен / пароль). И оба этих вызова могут принимать команду и файл как один аргумент. Из MSDN:
Параметр lpApplicationName может быть НОЛЬ. В этом случае имя модуля должен быть первым белым маркер с пробелами в Строка lpCommandLine. ...
Имя lpApplication сопоставляется с ProcessStartInfo.Filename, а lpCommandLine сопоставляется с аргументами. Так что вы должны просто пойти:
var processStartInfo = new ProcessStartInfo()
{
UseShellExecute = false,
Arguments = cmd
};
Process.Start(processStartInfo);