2008-10-20 2 views
2

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

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

+1

Не могли бы вы объяснить, пожалуйста, этот вопрос дальше. Очевидно, deadcat понял это, так как его ответ был принят. Что он хочет читать из реестра ... программа, имя программы, другое? – 2008-10-21 13:50:05

ответ

6

Я решил это так же, как и выше, с помощью 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 завершает процесс, если он работает слишком долго.

0

Есть несколько, по сути.

  1. Вы можете вызвать cmd.exe с/C [вашей командной строкой] в качестве аргументов. Это приводит к тому, что cmd.exe обрабатывает вашу команду, а затем завершает работу.
  2. Вы можете написать команду в пакетный файл и запустить это.

И, конечно же, есть подход, который вы принимаете сейчас, а именно разбор командной строки.

+0

По выбору 1 вы имеете в виду запуск ProcessInfo с cmd.exe в качестве имени файла и '/ c ' в качестве аргументов? – sebagomez 2008-10-20 23:13:09

+0

Я думаю, вы имеете в виду ProcessStartInfo, но да, заполните это и передайте его в Process.Start. Вы можете установить для параметра UseShellExecute значение false, чтобы запустить его в фоновом режиме. Если вам не нужно скрывать окно CMD.EXE во время выполнения команды, вы можете просто использовать Process.Start («cmd.exe», «/ c» + myargs). – 2008-10-21 01:01:12

0

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

Параметр lpApplicationName может быть NULL. В этом случае имя модуля должно быть первым белым маркером с пространственным разделением в строке lcCommandLine . ...

lpApplication name maps to ProcessStartInfo.Filename и lpCommandLine сопоставляются с аргументами. Поэтому вы должны быть в курсе:

var processStartInfo = new ProcessStartInfo() 
{ 
    UseShellExecute = false, 
    Arguments = cmd 
}; 
Process.Start(processStartInfo);