2016-07-25 6 views
0

Я хочу добавить возможности PowerShell к программе C# и Я включил сборку system.managment.automation.dll в качестве ссылки. я нашел на StackOverflow два способа вызова scrit PowerShell из C#:Сценарий Powershell, использующий system.managment.automation, все равно будет работать после того, как его хозяин C# умрет?

  • Использование пространств выполнения:

  • Не с использованием пространств выполнения:

    PowerShell powerShell = PowerShell.Create(); 
    powerShell.AddScript("my script"); 
    powerShell.Invoke(); 
    

Согласно this website , похоже, экземпляр Powershell привязан к его узлу C#.

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

Кроме того, скрипт PowerShell использует встроенную system.managment.automation.dll сборку и не общесистемные один, так что сценарий будет логически остановить с C# хоста.

Выполняется ли сценарий Powershell после закрытия пользователем моей программы? Как насчет двух методов?

PS: Я хочу поддерживать PowerShell v2.

+0

Когда вы делаете 'powerShell = PowerShell.Create()' и 'powerShell.Invoke()', пространство неявно создается. Это пространство будет «умирать» с хост-приложением –

+0

Итак, оба метода одинаковы, первый - это только сжатая версия второго? – cgcmake

+0

Я бы сказал, что первое менее кратким (более подробный код), но да, они одинаковые –

ответ

0

Давайте это в обратной хронологии:

Что о двух методах?

Там нет такого понятия, как работает код Powershell с помощью «не с использованием» пространств выполнения.

Простое объяснение состоит в том, что пространство выполнения является основным условием - как следует из названия, пространство выполнения является пространство, в котором код PowerShell запустить с.

Когда вы делаете:

PowerShell powerShell = PowerShell.Create() 

пространство выполнения неявно создается и прикрепляется к экземпляру PowerShell.

Единственное отличие состоит в том, что вы просто откладываете контроль над созданием Runspace в API System.Management.Automation, а не создаете его сами.

Выполняется ли сценарий Powershell после закрытия пользователем моей программы?

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

В противном случае пробел (неявный или нет) будет удален вместе с остальной частью хост-приложения, когда он выйдет.

+0

Есть ли способ/трюк для скрипта PowerShell для продолжения после того, как программа умирает? (может вызвать вызов PowerShell.exe на хосте?) – cgcmake

+0

Несколько вариантов. Запланируйте задачу, запустите 'powershell.exe' и т. Д. Что вы пытаетесь выполнить точно? –

+0

Оповести пользователя о том, что файл/папка была создана/удалена в каталоге, указанном пользователем через графический интерфейс. Но это будет только одна из особенностей программы, и я не хочу прекращать просмотр этого каталога, потому что пользователь закрывает программу. BTW У меня есть еще одна идея: создать новый процесс? – cgcmake