Поделиться через


Создание рабочего процесса сценария

 

Применимо к:Windows Server 2012, Windows Server 2012 R2

В этом разделе рассказывается, как создать рабочий процесс на языке сценариев Windows PowerShell®, который также используется для написания функций и сценариев в Windows PowerShell. Такие рабочие процессы можно запускать из командной строки, встраивать их в сценарии и модули сценариев.

Сведения о написании рабочих процессов на XAML, собственном языке Windows Workflow Foundation, см. в статье Написание рабочего процесса Windows PowerShell в библиотеке MSDN.

Планирование рабочего процесса

Рабочий процесс Windows PowerShell — это мощное решение, которое за одно выполнение может собирать данные или менять их на сотнях разных компьютеров. Старайтесь делать рабочий процесс проще и эффективнее. Помните, что рабочий процесс может приостанавливаться или его могут приостанавливать пользователи, что им можно управлять из многих сеансов PSSession, которые подключаются к одному серверному процессу, что его можно перезапускать, что он может включать команды и функции, выполняющиеся параллельно, и что каждая команда выполняется в собственном сеансе.

Воспользуйтесь указанными ниже рекомендациями.

  • Если вы не знакомы с рабочими процессами, ознакомьтесь со справочными разделами, приведенными в этом разделе, включая Синтаксические различия между рабочими процессами сценариев и сценариями.

  • Начните с составления списка задач, которые будет выполнять рабочий процесс. Отметьте блоки, которые могут выполняться параллельно или необязательно должны выполняться в заданном порядке. В этих блоках отметьте все задачи, которые должны выполняться последовательно.

  • Оформите задачи в виде функций внутри рабочего процесса. Для каждой задачи используйте имеющийся командлет Windows PowerShell или создайте новую команду и добавьте контрольную точку после каждого важного шага.

  • Рабочие процессы предназначены для запуска на разных компьютерах. В рабочем процессе не нужно создавать удаленные сеансы или использовать удаленные команды, например использующие командлет Invoke-Command.

  • Как и для любого сценария, работающего на разных компьютерах, нужно помнить о различиях компьютеров, которые могут влиять на работу сценария, включая разные операционные системы, устройства, организацию файловой системы, переменные среды и версии Windows PowerShell.

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

Для создания рабочего процесса используйте редактор сценариев, например интегрированную среду сценариев Windows PowerShell (ISE), который проверяет синтаксис и выделяет ошибки. Синтаксические различия между сценариями и рабочими процессами весьма велики, поэтому средство, которое умеет работать как с рабочими процессами, так и со сценариями, даст серьезную экономию в объеме кодирования и затраченного времени.

Подробнее о задачах, хорошо подходящих для рабочих процессов, см. в подразделе "Различия рабочих процессов и сценариев Windows PowerShell" в разделе Общие сведения о рабочем процессе Windows PowerShell.

Ключевое слово Workflow

Код рабочего процесса начинается с ключевого слова workflow, которое указывает Windows PowerShell на команду рабочего процесса. Ключевое слово workflow в рабочем процессе сценария является обязательным. После ключевого слова workflow идет имя рабочего процесса. Тело рабочего процесса заключается в фигурные скобки.

Ниже приведен синтаксис ключевого слова Workflow.

workflow Test-Workflow
{
    ...
}

Подробнее о ключевых словах в языке сценариев Windows PowerShell см. в разделе about_Language_Keywords.

Именование рабочих процессов и их элементов

Рабочий процесс — это тип команды в Windows PowerShell. Выбирайте название в формате «глагол — существительное». Для выбора утвержденного глагола для имени используйте командлет Get-Verb командлета и раздел справки Утвержденные глаголы для команд Windows PowerShell. При импорте из модуля команд, в названии которых нет утвержденных глаголов, Windows PowerShell выводит предупреждение. Используйте описательное существительное и при необходимости предлог, чтобы избежать конфликта имен команд при импорте рабочего процесса в сеанс.

В именах параметров и переменных в рабочих процессах можно использовать только буквы, цифры, дефис (-) и символ подчеркивания (_). Старайтесь не использовать дефис в именах параметров, поскольку каждое употребление параметра с именем, содержащим дефис, в рабочем процессе и в вызовах рабочего процесса нужно заключать в фигурные скобки. Не используйте имена общих параметров рабочих процессов, переменных рабочих процессов времени выполнения и другие зарезервированные слова, такие как workflow и parallel.

Подробнее о параметрах рабочих процессов времени выполнения см. в разделе справки Перечисление PSWorkflowRunTimeVariable в библиотеке MSDN.

Подробнее о зарезервированных словах см. в разделе "Зарезервированные слова в рабочих процессах" в Синтаксические различия между рабочими процессами сценариев и сценариями и в разделе справки about_Reserved_Words.

Добавление параметров в рабочий процесс

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

В приведенных ниже фрагментах кода показан синтаксис ключевого слова Param и атрибута Parameter в рабочем процессе сценария.

workflow Test-Workflow
{
param ([Type]$<ParameterName>)
}

workflow Test-Workflow
{
    Param
    (
        [Parameter(Mandatory=<$True | $False>)]
        [<Type>]
        $<ParameterName>
    )
}

Вы также можете использовать атрибут CmdletBinding для задания атрибутов ConfirmImpact, DefaultParameterSetName, HelpUri и SupportsShouldProcess.

В приведенном ниже фрагменте кода показан синтаксис образца рабочего процесса, в котором используется атрибут CmdletBinding.

workflow Test-Workflow
{   
    [CmdletBinding(ConfirmImpact=<String>,
        DefaultParameterSetName=<String>,
        HelpURI=<URI>,
        PositionalBinding=<Boolean>)]

    Param
    (
        [parameter(Mandatory=$true)]
        [String[]]
        $<ParameterName>
    )
}

Добавлять в рабочий процесс общие параметры рабочих процессов не нужно. Рабочий процесс Windows PowerShell добавляет общие параметры и общие параметры рабочих процессов во все рабочие процессы, включая простые, в которых нет атрибута CmdletBinding или Parameter.

Дополнительные сведения о параметрах в функциях и рабочих процессах см. в следующих разделах справки.

Добавление действий в рабочий процесс

Действие — это базовый блок работы в рабочем процессе. Каждая команда и выражение, используемые в рабочем процессе, выполняются как действие. В Windows PowerShell Workflow действие очень похоже на командлет. Чтобы выполнить действие, надо ввести его имя с параметрами.Windows PowerShell Workflow преобразует многие включенные командлеты Windows PowerShell в действия. Исключается очень мало командлетов. Список исключенных командлетов см. в подразделе "Исключенные командлеты" в разделе Использование действий в рабочих процессах сценариев.

Большая часть базовых командлетов Windows PowerShell реализована в виде действий. Для их использования в рабочем процессе просто введите имя командлета или его псевдоним.

Например, в приведенном ниже рабочем процессе есть действие Get-Process.

workflow Test-Workflow
{
    Get-Process -Name PowerShell
    gps -Name Winword
}

Если у командлета нет соответствующего действия и он явно не исключен, Windows PowerShell Workflow автоматически выполняет командлет в действии inlineScript и возвращает результат в рабочий процесс.

Например, приведенный ниже рабочий процесс использует командлет Get-WindowsFeature, который выполняется неявно в действии inlineScript.

workflow Test-Workflow
{
    Get-Process -Name PowerShell
    Get-WindowsFeature -Name PowerShell, PowerShell-v2
}

Можно выполнять даже исключенные командлеты, не реализованные в виде действий, однако они должны выполняться в действии inlineScript. Например, в приведенном ниже рабочем процессе используется действие inlineScript для выполнения исключенного командлета Get-Variable.

workflow Test-Workflow
{
    Get-Process -Name PowerShell
    Get-WindowsFeature -Name PowerShell, PowerShell-v2
    InlineScript { Get-Variable -Name PSHome }
}

В рабочем процессе также можно использовать выражения, в том числе арифметические и операторы сравнения.Windows PowerShell Workflow автоматически вычисляет выражения в специальном действии, предназначенном для этой цели.

Например, в следующем рабочем процессе есть выражение. Как и все выражения, оно вычисляется в действии.

workflow Test-Workflow
{
    Get-Process -Name PowerShell
    Get-WindowsFeature -Name PowerShell, PowerShell-v2
    InlineScript { Get-Variable PSHome }

    320GB / 3MB
}

Подробнее о действиях см. в разделе Использование действий в рабочих процессах сценариев.

Использование параметров действий

Действия — это команды с параметрами, как и командлеты. Когда командлет преобразуется в действие, синтаксис и параметры остаются без изменений. Есть несколько исключений, приведенных в разделе справки «Действия в рабочих процессах сценариев».

Однако в действиях не допускаются позиционные параметры, поэтому у всех параметров должно быть имя. Разрешается использовать псевдонимы и аббревиатуры параметров. Например, в приведенном ниже примере рабочего процесса параметры Name командлетов Get-Process, Get-WindowsFeature и Get-Variable используются в командах.

workflow Test-Workflow
{
    Get-Process -Name PowerShell
    Get-WindowsFeature -Name PowerShell, PowerShell-v2
    InlineScript { Get-Variable -Name PSHome }
}

В действиях также недопустимы динамические параметры. Чтобы вызвать динамический параметр, нужно вложить команду в действие InlineScript. Например в приведенном ниже рабочем процессе есть действие inlineScript, где используется динамический параметр CodeSigningCert командлета Get-ChildItem. Параметр CodeSigningCert добавляется поставщиком сертификатов и работает только на диске Cert:.

workflow Test-Workflow
{
   InlineScript {Get-ChildItem -Path Cert:\CurrentUser -CodeSigningCert}
} 

Подробнее о действии inlineScript см. в разделе Выполнение команд Windows PowerShell в рабочем процессе.

Использование общих параметров действий

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

Некоторые общие параметры рабочих процессов также являются общими параметрами действий. Это позволяет для конкретных действий запрещать определенные значения общих параметров рабочих процессов. Например, можно использовать параметр PSComputerName действия для выполнения действия только на выбранных компьютерах или параметр PSCredential для выполнения действия с альтернативными учетными данными.

Общие параметры действий допустимы в большинстве действий, но не во всех. Например, общие параметры действий недопустимы в действиях Suspend-Workflow и Checkpoint-Workflow. Кроме того, общие параметры действий недоступны в командлетах и выражениях, которые рабочий процесс Windows PowerShell автоматически выполняет в действии. Общие параметры действий доступны в действии InlineScript, но не в командах в блоке сценария InlineScript.

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

workflow Test-Workflow
{
    Get-Process -Name PowerShell -PSComputerName Server01, Server 12
    InlineScript { Get-Variable -Name PSHome } -PSRunningTimeoutSec 3600

    #No activity common parameters.
    Get-WindowsFeature -Name PowerShell, PowerShell-v2  

    #No activity common parameters.
    320GB / 3MB
}

Подробнее об общих параметрах действий см. в разделе Использование действий в рабочих процессах сценариев.

Получение значений общих параметров

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

Значения переменных крайне полезны. Потратьте время на ознакомление с ними, чтобы использовать в своих рабочих процессах. Например, при запуске рабочего процесса параметр PSComputerName получает имена целевых компьютеров, но при доступе к переменной $PSComputerName в рабочем процессе она содержит имя компьютера, на котором в настоящий момент выполняется рабочий процесс.

Подробнее о переменных рабочих процессов времени выполнения см. в разделе Перечисление PSWorkflowRuntimeVariable.

Для доступа к значениям параметров из рабочего процесса используется имя переменной. Определять переменную не нужно.

Например, в приведенном ниже рабочем процессе используется значение общего параметра PSConnectionRetryCount путем обращения к нему как к переменной $PSConnectionRetryCount.

workflow Test-Workflow
{
    "Retry count is $PSConnectionRetryCount."
}

В примере ниже показано, что при использовании параметра PSConnectionRetryCount во время выполнения рабочего процесса значение параметра доступно внутри рабочего процесса.

PS C:\>Test-Workflow -PSConnectionRetryCount 4
Retry count is 4.

Чтобы изменить значения общих параметров и параметров времени выполнения в рабочем процессе, используйте действие Set-PSWorkflowData.

Например, приведенный ниже рабочий процесс содержит команду, которая меняет значение PSConnectionRetryCount.

workflow Test-Workflow
{
    "Retry count is $PSConnectionRetryCount."
    Set-PSWorkflowData -PSConnectionRetryCount 5
    "Retry count is $PSConnectionRetryCount."
}

PS C:\>Test-Workflow -PSConnectionRetryCount 4
Retry count is 4.
Retry count is 5.

Подробнее о переменных в Windows PowerShell Workflow см. в следующих разделах справки:

Получение значений общих параметров и параметров времени выполнения

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

Значения переменных крайне полезны. Потратьте время на ознакомление с ними, чтобы использовать в своих рабочих процессах. Например, при запуске рабочего процесса параметр PSComputerName получает имена целевых компьютеров, но при доступе к переменной $PSComputerName в рабочем процессе она содержит имя компьютера, на котором в настоящий момент выполняется рабочий процесс.

Подробнее о переменных рабочих процессов времени выполнения см. в разделе Перечисление PSWorkflowRuntimeVariable.

Для доступа к значениям параметров из рабочего процесса используется имя переменной. Определять переменную не нужно.

Например, в приведенном ниже рабочем процессе используется значение общего параметра PSConnectionRetryCount путем обращения к нему как к переменной $PSConnectionRetryCount.

workflow Test-Workflow
{
    "Retry count is $PSConnectionRetryCount."
}

В примере ниже показано, что при использовании параметра PSConnectionRetryCount во время выполнения рабочего процесса значение параметра доступно внутри рабочего процесса.

PS C:\>Test-Workflow -PSConnectionRetryCount 4
Retry count is 4.

Чтобы изменить значения общих параметров и параметров времени выполнения в рабочем процессе, используйте действие Set-PSWorkflowData.

Например, приведенный ниже рабочий процесс содержит команду, которая меняет значение PSConnectionRetryCount.

workflow Test-Workflow
{
    "Retry count is $PSConnectionRetryCount."
    Set-PSWorkflowData -PSConnectionRetryCount 5
    "Retry count is $PSConnectionRetryCount."
}

PS C:\>Test-Workflow -PSConnectionRetryCount 4
Retry count is 4.
Retry count is 5.

Подробнее о переменных в Windows PowerShell Workflow см. в следующих разделах справки:

Запуск сценария в рабочем процессе

Чтобы запустить сценарий (PS1-файл) в рабочем процессе, нужно вложить вызов сценария в действие InlineScript. Как и другие команды и действия, сценарий выполняется на всех целевых компьютерах рабочего процесса, а результат возвращается в рабочий процесс.

Например, в следующем рабочем процессе есть действие InlineScript, которое выполняет сценарий. Сценарий хранится в общем каталоге. Рабочий процесс использует параметр действия PSPersist для установки контрольной точки по завершении сценария.

workflow Test-Workflow
{
   $AssetData =InlineScript {\\Server01\Share01\Get-AssetData.ps1 -All} -PSPersist
   ...
}

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

Параллельный запуск команд

Ключевые слова Parallel и ForEach -Parallel оптимизируют рабочий процесс, выполняя команды параллельно в неопределенном порядке. Ключевое слово Sequence запускает выбранные команды последовательно внутри блока сценария Parallel. Эти ключевые слова допустимы только в рабочем процессе. Они допустимы во вложенных рабочих процессах, но недопустимы во вложенных функциях в рабочем процессе. По умолчанию команды выполняются последовательно, когда перед началом очередной команды обязательно должна закончиться предыдущая.

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

Следующие типы команд и действий хорошо подходят для параллельного исполнения.

  • Команды, которые не используют данные совместно, такие как Get-Process и Get-Service.

  • Команды, которые выполняются для набора схожих элементов. Большинство операторов ForEach хорошо подходят для выполнения ForEach -Parallel.

Parallel

Команды в блоке сценария Parallel могут выполняться одновременно. Порядок их запуска не определен.

В примере ниже показан синтаксис рабочего процесса с ключевым словом Parallel и блоком сценария.

workflow Test-Workflow
{
    Parallel
    {
         <Activity>
         <Activity>
...
    }
}

Например, в следующем рабочем процессе имеется блок сценария Parallel, в котором выполняются действия, обращающиеся к процессам и службам на компьютере. Поскольку вызовы Get-Process и Get-Service не зависят друг от друга, они могут выполняться параллельно и в любом порядке.

workflow Test-Workflow
{
    Parallel
    {
         Get-Process
         Get-Service
    }
}

ForEach -Parallel

Параметр Parallel ключевого слова ForEach выполняет команды в блоке сценария ForEach один раз для каждого элемента в указанной коллекции. Элементы в коллекции обрабатываются параллельно. Команды в блоке сценария выполняются последовательно.

Как и для оператора ForEach в Windows PowerShell, переменная, которая содержит коллекцию ($<Коллекция>), должна определяться до оператора ForEach -Parallel, однако переменная текущего элемента ($<элемент>) определяется внутри оператора ForEach -Parallel.

В примере ниже показан синтаксис команды.

workflow Test-Workflow
{
    ForEach -Parallel ($<item> in $<collection>)
    {
       <Activity1>
       <Activity2>
 ...
    }
}

Например, приведенный ниже рабочий процесс содержит оператор Foreach -Parallel, обрабатывающий диски, полученные действием Get-Disk. Команды в блоке сценария идут последовательно, однако на дисках они выполняются параллельно.

workflow Test-Workflow
{
    $Disks = Get-Disk
    ForEach -Parallel ($Disk in $Disks)
    {
        $DiskPath = $Disk.Path   
        $Disk | Initialize-Disk
        Set-Disk -Path $DiskPath
    }
}

Sequence

Ключевое слово Sequence выполняет команды последовательно внутри блока сценария Parallel. Блок сценария Sequence выполняется параллельно с другими командами, однако команды внутри блока сценария sequence выполняются последовательно и в указанном порядке.

Во фрагменте кода ниже показан синтаксис блока сценария Sequence. Действие Activity3 может выполняться одновременно с Activity1 и Activity2 или до них, но Activity4 не запустится до завершения Activity3.

workflow Test-Workflow
{
    parallel
    {
       <Activity1>
       <Activity2>

       sequence 
       {
           <Activity3>
           <Activity4>
           ...
       }
        ...
    }
}