about_Workflows

简短说明

提供对 PowerShell 工作流功能的简短介绍。

长说明

PowerShell 工作流将 Windows Workflow Foundation 的优势引入到 PowerShell 中,让你可以编写和运行工作流。

PowerShell 工作流是在 PowerShell 3.0 中引入的,一直到 PowerShell 5.1 都提供该模块。 有关 PowerShell 工作流的详细信息,请参阅工作流指南编写 Windows PowerShell 工作流

关于工作流程

工作流是包含相关活动的有序序列的命令。 通常,它们会运行很长一段时间,从数百台计算机(通常在异构环境中)收集数据并对其进行更改。

工作流可以采用 XAML(Windows Workflow Foundation 中使用的语言)或 PowerShell 语言编写。 工作流通常打包在模块中并包含帮助主题。 有关详细信息,请参阅 XAML 概述 (WPF)

工作流在 IT 环境中至关重要,因为它们可以在重新启动后继续存在并从常见故障中自动恢复。 可以与运行工作流的会话和计算机断开连接并重新连接,而无需中断工作流处理,并且可以透明地暂停和恢复工作流而不会丢失数据。 可以记录和审核工作流中的每个活动以供参考。 工作流可以作为作业运行,并且可以使用 PowerShell 的“计划作业”功能来计划。

工作流中的状态和数据在工作流的开头和末尾以及你指定的点保存或持久保留。 工作流持久性点以类似于数据库快照或程序检查点的方式工作,以便保护工作流免受中断和故障的影响。 如果工作流无法从故障中恢复,你可以使用持久保留的数据并从最后一个持久性点恢复,而不是从头开始重新运行一个很大的工作流。

工作流要求和配置

PowerShell 工作流配置包含以下元素:

  • 运行工作流的客户端计算机。
  • 客户端计算机或远程计算机上的工作流会话 PSSession
  • 托管节点,即受工作流活动影响的目标计算机。

工作流会话不是必需的,但建议使用。 PSSessions 可以利用 PowerShell 的可靠恢复和“断开连接的会话”功能来恢复断开连接的工作流会话。 有关详细信息,请参阅 about_Remote_Disconnected_Sessions

由于客户端计算机和运行工作流会话的计算机可以是托管节点,因此你可以在履行所有角色的单个计算机上运行工作流。

客户端计算机和运行工作流会话的计算机必须运行 PowerShell 3.0。 所有符合条件的系统都受支持,包括 Windows Server 操作系统的服务器核心安装选项。

若要运行包含 cmdlet 的工作流,托管节点必须具有 Windows PowerShell 2.0 或更高版本。 除非工作流包含 cmdlet,否则托管节点不需要 PowerShell。 可以在没有 PowerShell 的计算机上运行包含 Windows Management Instrumentation (WMI) 和通用信息模型 (CIM) 命令的工作流。

如何获取工作流

工作流通常打包在模块中。 若要导入包含工作流的模块,请使用该模块中的任何命令或使用 Import-Module cmdlet。 首次使用模块中的任何命令时,模块会自动导入。

若要查找计算机上安装的模块中的工作流,请使用 Get-Command cmdlet 的 CommandType 参数。

Get-Command -CommandType Workflow

如何运行工作流

若要运行工作流,请使用以下过程。

  1. 当托管节点是本地计算机时,此步骤不是必需的。 否则,在客户端计算机上,使用“以管理员身份运行”选项启动 PowerShell。

    Start-Process PowerShell -Verb RunAs
    
  2. 在运行工作流会话的计算机上以及受包含 cmdlet 的工作流影响的托管节点上启用 PowerShell 远程处理。

    只需在每个参与的计算机上执行此步骤一次。

    仅当运行包含 cmdlet 的工作流时,此步骤才是必需的。 无需在客户端计算机上启用远程处理,除非工作流会话在客户端计算机或任何运行 PowerShell 3.0 的托管节点上运行。

    若要启用远程处理,请使用 Enable-PSRemoting cmdlet。

    Enable-PSRemoting -Force
    

    可以使用“启用脚本执行”组策略设置来启用远程处理。 有关详细信息,请参阅 about_Group_Policy_Settingsabout_Execution_Policies

  3. 使用 New-PSWorkflowSessionNew-PSSession cmdlet 创建工作流会话。

    New-PSWorkflowSession cmdlet 启动一个会话,该会话使用目标计算机上的内置 Microsoft.PowerShell.Workflow 会话配置。 此会话配置包括专为工作流设计的脚本、类型和格式设置文件以及选项。

    或者,使用 New-PSSession cmdlet。 使用 ConfigurationName 参数来指定 Microsoft.PowerShell.Workflow 会话配置。 此命令与使用 New-PSWorkflowSession cmdlet 相同。

    替代方法是使用 New-PSSession cmdlet。 使用 ConfigurationName 参数来指定 Microsoft.PowerShell.Workflow 会话配置。

    在本地计算机上:

    $ws = New-PSWorkflowSession
    

    在远程计算机上:

    $ws = New-PSWorkflowSession -ComputerName Server01 `
    -Credential Domain01\Admin01
    

    如果你是工作流会话计算机上的管理员,则可以使用 New-PSWorkflowExecutionOption cmdlet 为工作流会话配置创建自定义选项设置。 并且,使用 Set-PSSessionConfiguration cmdlet 来更改会话配置。

    $sto = New-PSWorkflowExecutionOption -MaxConnectedSessions 150
    Invoke-Command -ComputerName Server01 `
    {Set-PSSessionConfiguration Microsoft.PowerShell.Workflow `
    -SessionTypeOption $Using:sto}
    $ws = New-PSWorkflowSession -ComputerName Server01 `
    -Credential Domain01\Admin01
    
  4. 在工作流会话中运行工作流。 若要指定托管节点(目标计算机)的名称,请使用 PSComputerName 工作流通用参数。

    以下示例运行名为 Test-Workflow 的工作流。

    在托管节点是承载工作流会话的计算机的情况下:

    Invoke-Command -Session $ws {Test-Workflow}
    

    在托管节点是远程计算机的情况下。

    Invoke-Command -Session $ws{
    Test-Workflow -PSComputerName Server01, Server02 }
    

    以下示例在数百台计算机上运行 Test-WorkflowGet-Content cmdlet 从文本文件中获取计算机名称,并将其保存在本地计算机上的 $Servers 变量中。

    Invoke-Command 使用 $Using 范围修饰符来定义本地会话中的 $Servers 变量。 有关 $Using 范围修饰符的详细信息,请参阅 about_Remote_Variables

    $Servers = Get-Content Servers.txt
    Invoke-Command -Session $ws {Test-Workflow -PSComputerName $Using:Servers }
    

使用工作流通用参数

工作流通用参数是 PowerShell 自动添加到所有工作流的一组参数。 PowerShell 会将 cmdlet 通用参数添加到所有工作流,即使工作流不使用 CmdletBinding 属性也是如此。

例如,以下工作流未定义任何参数。 但是,运行该工作流时,它具有 commonParameters 和 WorkflowCommonParameters

workflow Test-Workflow {Get-Process}
Get-Command Test-Workflow -Syntax
Test-Workflow [<WorkflowCommonParameters>] [<CommonParameters>]

工作流通用参数包括运行工作流所必需的多个参数。 例如,PSComputerName 通用参数指定该工作流所影响的托管节点。

Invoke-Command -Session $ws {
  Test-Workflow -PSComputerName Server01, Server02
}

PSPersist 工作流通用参数确定何时持久保留工作流数据。 使用它可以将活动之间的持久性点添加到未定义持久性点的工作流。

Invoke-Command -Session $ws {
  Test-Workflow -PSComputerName Server01, Server02 -PSPersist:$True
}

使用其他工作流通用参数,可以指定与托管节点的远程连接的特征。 其名称和功能类似于远程处理 cmdlet(包括 Invoke-Command)的参数。

Invoke-Command -Session $ws {
  Test-Workflow -PSComputerName Server01, Server02 -PSPort 443
}

请注意区分定义工作流会话连接的远程处理参数与定义与托管节点的连接的 PS-prefixed 工作流通用参数。

$ws = New-PSSession -ComputerName Server01 -ConfigurationName Microsoft.PowerShell.Workflow

Invoke-Command -Session $ws {
  Test-Workflow -PSComputerName Server01, Server02 -PSConfigurationName Microsoft.PowerShell.Workflow
}

某些工作流通用参数对工作流是唯一的,例如 PSParameterCollection 参数,该参数用于为不同的远程节点指定不同的工作流通用参数值。 有关工作流通用参数的列表和说明,请参阅 about_WorkflowCommonParameters

另请参阅