2015-05-15 3 views
0

Я пишу встроенный хост powershell в C# (приложение Windows), а если есть внешняя программа, вызываемая в конвейере, консольное окно мигает, когда оно выполняется. Ping и NetStat являются примерами этого, как показано в следующем фрагменте кодаПользовательский Powershell Host Вызывает внешнюю программу без окна консоли

using (PowerShell PowerShellInstance = PowerShell.Create()) 
    { 

     PowerShellInstance.AddScript("Get-Content test.txt; ls; ping www.google.com"); 

     PowerShellInstance.Invoke(); 

     # ...more code here to print output etc 

    } 

После выполнения команды пинг достигается в трубопроводе консольное окно будет всплывающее окно выполнения команды и возвращать результаты. Я хотел бы сделать это без отображения окна консоли. Я искал и нашел примеры того, как справиться с этим, начав процесс для внешних команд и перенаправляя вывод.

Я могу это сделать, конечно, но как бы проверить, является ли команда в конвейере вызовом внешней программы?

Мне бы очень хотелось иметь возможность обрабатывать это в общем случае, если это возможно; что я не хочу тестировать конкретные программы (например, ping, netstat, net), если мне это не нужно. Собственный powershell.exe делает это так, что это возможно.

+0

Любые причины, по которым вы не хотите использовать встроенные методы для этих целей? Как https://msdn.microsoft.com/en-us/library/system.net.networkinformation.ping%28v=vs.110%29.aspx? –

+0

Нет, это сработает, если у вас есть методы для всех обычных утилит Windows. Это так? Кроме того, если пользователь вводит «netstat» во встроенную командную строку, PowershellInstance автоматически вызывает netstat.exe? Как я могу сказать это иначе, не анализируя каждую команду, а затем проверяя, есть ли у нее встроенный альтернативный метод. Я хотел бы иметь такую ​​же функциональность в своем приложении, что и родной powershell.exe, если это возможно. – RG5

+0

Как создать сценарий и запустить его через командную строку с помощью 'Process.Start' и установить, чтобы он не создавал окно? Вы можете перенаправить стандартные потоки ввода/вывода обратно в приложение и прочитать его со стандартными объектами потока. –

ответ

0

Оказалось, что это ожидаемое поведение вызывающих консольных команд. В Windows 7 и выше conhost.exe отвечает за обработку вызовов консольных программ. В этом случае ping и netstat запускают экземпляр conhost, который должен быть создан, он обрабатывает запрос, возвращает результаты и затем остается открытым. Запуск conhost.exe вызывает то, что вызывает консольную вспышку, которую я вижу. Тот факт, что он остается открытым, - это то, что я видел только одно оконное окно консоли. Когда conhost подключен к вызывающему процессу, все последующие консольные команды обрабатываются этим же экземпляром.

Я отмечаю это как ответ, потому что новый вопрос должен быть создан для специфического адреса.

Источник. Windows Internals Part 1

Смежные вопросы