Как выполнить сложную пакетную команду на лету - PullRequest
1 голос
/ 26 февраля 2010

Я ищу способ запуска пакета DOS / Windows непосредственно из кода C # без сохранения его в виде файла .BAT. В основном мне интересно запустить команду DOS с комбинацией потока stdin.

Допустим, мне нужно выполнить что-то вроде этого:

echo 'abcd' | programXXX.exe -arg1 --getArgsFromStdIn

После этого programXXX.exe примет строку 'abcd' как -arg1

Сейчас я просто создаю bat-файл в каталоге TMP и запускаю его, удаляя после выполнения.
Что мне нужно, так это запустить его «на лету» только из кода .NET без сохранения в файл ранее.
(Основная причина - безопасность, но она также не хочет оставлять мусор при сбое программы и т. Д.)

Вы знаете, как этого добиться?

Ответы [ 3 ]

2 голосов
/ 26 февраля 2010

Вы можете использовать Process.Start.

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

1 голос
/ 26 февраля 2010

Переключение на PowerShell (PSH) даст вам гораздо больше возможностей для выполнения команд. PSH выполняется в процессе, и несколько командных строк могут быть выполнены в одной runspace (область действия / контекст) с полным контролем над конвейерами ввода и вывода объекта:

var runspace = RunspaceFactory.CreateRunspace();
PSSnapInException pex;
var loadedSnapIn = Runspace.RunspaceConfiguration.AddPSSnapIn(SnapInName, out pex);
runspace.Open();
var pipe = runspace.CreatePipeline(commandline);
var output = pipe.Invoke();

Это создает пространство выполнения, загружает оснастку (то есть дополнительные пользовательские команды), устанавливает команду и выполняет ее, собирая коллекцию возвращаемых объектов.

1 голос
/ 26 февраля 2010

Я бы предложил два предложения

  1. используйте перенаправленный ввод-вывод и запустите программу из своего кода
  2. вы можете использовать Power Shell, как в этом учебнике
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...