Использование действия InvokePowerShell
Данный раздел относится к версии Windows Workflow Foundation 4.
Образец InvokePowerShell демонстрирует, как вызывать команды Windows PowerShell с помощью действия InvokePowerShell
.
Демонстрации
Простой новый метод использования команд Windows PowerShell.
Получите значения из канала выходных данных Windows PowerShell и сохраните их в переменных рабочего процесса.
Передайте данные в Windows PowerShell в виде канала входных данных для исполняемой команды.
Примечание |
---|
Образцы уже могут быть установлены на компьютере. Перед продолжением проверьте следующий каталог (по умолчанию).
<диск_установки>:\WF_WCF_Samples
Если этот каталог не существует, перейдите на страницу Образцы Windows Communication Foundation (WCF) и Windows Workflow Foundation (WF) для .NET Framework 4, чтобы загрузить все образцы Windows Communication Foundation (WCF) и WF. Этот образец расположен в следующем каталоге.
<диск_установки>:\WF_WCF_Samples\WF\Scenario\ActivityLibrary\PowerShell
|
Обсуждение
Этот образец содержит следующие три проекта.
Имя проекта | Описание | Основные файлы |
---|---|---|
CodedClient |
Образец клиентского приложения, использующий действие PowerShell. |
|
DesignerClient |
Набор пользовательских действий, содержащих пользовательское действие |
|
PowerShell |
Действие |
Файлы действия
Файлы конструктора:
|
Клиентские проекты обсуждаются в первую очередь, поскольку проще понять внутреннее функционирование действия PowerShell, изучив его практическое применение.
Использование этого образца
В следующих разделах описано, как использовать три проекта в образце.
Использование закодированного клиентского проекта.
Образец клиента программным образом создает действие InvokePowerShell
. При первом вызове запускается блокнот.
new InvokePowerShell()
{
CommandText = "notepad"
},
При втором вызове возвращается перечень процессов, запущенных на локальном компьютере.
new InvokePowerShell<Process>()
{
CommandText = "Get-Process",
Output = processes1,
},
Output
— это переменная, используемая для хранения выходных данных команды.
При следующем вызове показывается, как запускать стадию завершающей обработки для каждого отдельного выхода вызова PowerShell. Параметром InitializationAction
задается функция, выводящая строчное представление каждого процесса. Коллекция этих строк возвращается в переменную Output
действием InvokePowerShell<string>
.
При последующем вызове InvokePowerShell
демонстрируется передача данных действию и вывод конечных данных и ошибок.
Использование конструкторского клиентского проекта.
Проект DesignerClient состоит из набора пользовательских действий, большинство из которых содержат действие InvokePowerShell
. Большинство действий вызывают нестандартную версию действия InvokePowerShell
и не ожидают возвращаемого значения. Прочие действия применяют стандартную версию действия InvokePowerShell
и аргумент InitializationAction
для последующей обработки результатов.
Использование проекта PowerShell
Главное действие действия совершается в классе ExecutePowerShell
. Поскольку исполнение команд PowerShell не должно блокировать поток главного рабочего процесса, действие создается как асинхронное путем наследования от класса AsyncCodeActivity.
Метод BeginExecute вызывается средой выполнения рабочего процесса, чтобы начать исполнение действия. Для начала вызываются методы API-интерфейса PowerShell, чтобы создать конвейер PowerShell.
runspace = RunspaceFactory.CreateRunspace();
runspace.Open();
pipeline = runspace.CreatePipeline();
Затем создается команда PowerShell, которая заполняется параметрами и переменными.
Command cmd = new Command(this.CommandText, this.IsScript);
// loop over parameters and run: cmd.Parameters.Add(...)
// loop over variables and run: runspace.SessionStateProxy.SetVariable(...)
pipeline.Commands.Add(cmd);
Входящие исходные данные в этот момент также отправляются в конвейер. Наконец, конвейер получает оболочку из объекта PipelineInvokerAsyncResult
и возвращается. Объект PipelineInvokerAsyncResult
регистрирует прослушиватель и вызывает конвейер.
pipeline.InvokeAsync();
После успешного выполнения конечные данные и ошибки сохраняются в том же объекте PipelineInvokerAsyncResult
, а контроль возвращается среде выполнения рабочего процесса путем вызова метода обратного вызова, изначально переданного через параметр BeginExecute.
В конце исполнения метода среда выполнения рабочего процесса вызывает метод EndExecute действия.
Класс InvokePowerShell
создает оболочку для класса ExecutePowerShellCommand
и две версии действия: стандартную и нестандартную. Нестандартная версия возвращает конечные данные работы PowerShell непосредственно, а стандартная преобразует индивидуальные результаты в стандартный тип.
Стандартная версия действия реализуется как последовательный рабочий процесс, вызывающий команду ExecutePowerShellCommand
и проводящий конечную обработку ее результатов. Для каждого элемента из коллекции результатов на стадии конечной обработки вызывается действие InitializationAction
. если оно задано. В противном случае осуществляется простое приведение.
new ForEach<PSObject>
{
Values = psObjects,
Body = new ActivityAction<PSObject>
{
Argument = psObject,
Handler = new Sequence
{
Activities =
{
new If
{
Condition = // Is InitializationAction set?
Then = new InvokeFunc<PSObject, TResult>
{
Argument = psObject,
Result = outputObject,
Func = this.InitializationAction
},
Else = new Assign<TResult>
{
To = outputObject,
Value = new InArgument<TResult>(ctx => (TResult) psObject.Get(ctx).BaseObject),
}
},
new AddToCollection<TResult>
{
Collection = outputObjects,
Item = outputObject
},
}
}
}
},
Для каждого из двух действий InvokePowerShell
(стандартного и нестандартного) создается конструктор. InvokePowerShellDesigner.xaml и связанный с ним CS-файл определяют внешний вид в средстве Конструктор рабочих процессов нестандартного действия InvokePowerShell
. Внутри InvokePowerShellDesigner.xaml DockPanel представляет графический интерфейс.
<DockPanel x:Uid="DockPanel_1" LastChildFill="True">
<TextBlock x:Uid="TextBlock_1" Text="CommandText" />
<TextBox x:Uid="TextBox_1" Text="{Binding Path=ModelItem.CommandText, Mode=TwoWay}"
TextWrapping="WrapWithOverflow" AcceptsReturn="True" MinLines="4" MaxLines="4"
Background="{x:Null}" Margin="3" />
</DockPanel>
Стоит заметить, что свойство Text
текстового поля является двусторонней привязкой, гарантирующей, что значение свойства CommandText
действия будет эквивалентно значению, вводимому в конструктор.
GenericInvokePowerShellDesigner.xaml и связанный с ним CS-файл определяют графический интерфейс InvokePowerShell
нестандартного действия. Конструктор немного сложнее, поскольку позволяет пользователям задавать InitializationAction
. Ключевой элемент применения WorkflowItemPresenter — это возможность перетаскивать дочерние действия в область конструктора InvokePowerShell
.
<sap:WorkflowItemPresenter x:Uid="sap:WorkflowItemPresenter_1" Margin="0,10,0,10"
HintText="Drop Activities Here"
AllowedItemType="{x:Type sa:Activity}"
Item="{Binding Path=ModelItem.InitializationAction.Handler, Mode=TwoWay}"
Grid.Row="1" Grid.Column="1" />
Настройка конструктора не завершается настройкой XAML-файлов, определяющих внешний вид действия на холсте конструктора. Диалоговые окна, используемые для отображения параметров действия, тоже можно настроить. Эти параметры и переменные PowerShell влияют на поведение команд PowerShell. Действие предоставляет их как типы Dictionary. ArgumentDictionaryEditor.cs, PropertyEditorResources.xaml и PropertyEditorResources.cs определяют диалоговое окно, позволяющее изменять эти типы.
Настройка, построение и выполнение образца
Чтобы запустить этот образец, нужно установить Windows PowerShell. Установить Windows PowerShell можно отсюда: Windows PowerShell.
Запуск закодированного клиента
Откройте файл PowerShell.sln в среде Visual Studio 2010.
Щелкните решение правой кнопкой мыши и постройте его.
Щелкните правой кнопкой мыши проект CodedClient и выберите пункт Назначить запускаемым проектом.
Чтобы запустить приложение, нажмите клавиши CTRL+F5.
Запуск конструкторского клиента
Откройте файл PowerShell.sln в среде Visual Studio 2010.
Щелкните решение правой кнопкой мыши и постройте его.
Щелкните правой кнопкой мыши проект DesignerClient и выберите пункт Назначить запускаемым проектом.
Чтобы запустить приложение, нажмите клавиши CTRL+F5.
Известные проблемы
Если при обращении к сборке с действиями
InvokePowerShell
или проекту от другого проекта возникает ошибка, возможно, нужно вручную добавить элемент<SpecificVersion>True</SpecificVersion>
к CSPROJ-файлу нового проекта под строчкой, в которой происходит обращение кInvokePowerShell
.Если Windows PowerShell не установлен, то сразу же после добавления действия
InvokePowerShell
в рабочий процесс появится сообщение о следующей ошибке:У конструктора рабочего процесса возникли затруднения с вашим документом. Не удалось загрузить файл или сборку "System.Management.Automation"... или одну из ее зависимостей. Не удается найти указанный файл.
В среде Windows PowerShell 2.0 не удался вызов
$input.MoveNext()
программным образом, а в скриптах, использующих$input.MoveNext()
, формируются непреднамеренные ошибки и результаты. Чтобы решить эту проблему, попробуйте использовать операцию PowerShellforeach
, вместо того, чтобы вызыватьMoveNext()
при проходе по массиву.
Примечание |
---|
Образцы уже могут быть установлены на компьютере. Перед продолжением проверьте следующий каталог (по умолчанию).
<диск_установки>:\WF_WCF_Samples
Если этот каталог не существует, перейдите на страницу Образцы Windows Communication Foundation (WCF) и Windows Workflow Foundation (WF) для .NET Framework 4, чтобы загрузить все образцы Windows Communication Foundation (WCF) и WF. Этот образец расположен в следующем каталоге.
<диск_установки>:\WF_WCF_Samples\WF\Scenario\ActivityLibrary\PowerShell
|