PowerShell 工作流:编写、运行与管理指南
1. 工作流简介
在编写 PowerShell 脚本以自动化管理任务时,随着规模和范围的扩大,很快就会涉及到多机器的协调操作。多机器序列的协调在网络环境中是一项重大挑战,需要解决远程连接的一致性、机器连接的管理、网络中断的恢复以及任务的暂停、卸载和恢复等问题。PowerShell 3.0 版本的一个主要关注点就是解决这些复杂问题。
2. 编写工作流
2.1 问题与解决方案
如果你想编写一个工作流来自动化一个健壮、长时间运行的多机器 PowerShell 任务,可以使用 PowerShell 的
workflow
关键字来定义任务。以下是一个示例:
workflow Get-ComputerStatus
{
## This workflow can be suspended and resumed at any point,
## as it doesn't have any portions where one step depends
## on system state prepared by a previous step.
$PSPersistPreference = $true
## Get drive usage information
"Current disk usage"
"------------------"
$drives = Get-PSDrive
## Override persistence on a command that doesn't
## support it.
$drives | Sort-Object -Property Free -Descending -PSPersist:$false
## See which non-system processes have consumed the
## most CPU
"`nProcess CPU usage"
"-------------------"
InlineScript
{
$userProcesses = Get-Process |
Where-Object Path -notlike ($env:WINDIR + "*")
$userProcesses = $userProcesses | Sort CPU | Select Name,CPU,StartTime
$userProcesses | Select -Last 10
}
## Get licensing status
"`nLicense status"
"----------------"
cscript $env:WINDIR\system32\slmgr.vbs /dlv
}
PS > Get-ComputerStatus -PSComputerName Server1,Server2
2.2 工作流的优势
- 健壮性 :基于 Windows Workflow Foundation 的核心工作流引擎,通过可靠的基于文件系统的持久性来实现工作流状态的恢复,并能智能重试失败的操作。
- 长时间运行 :支持作为 PowerShell 作业运行,提供了简单的检查点、暂停和恢复功能。
- 多机器 :自动处理连接管理,支持无缝的多机器处理。
- 可重用性 :基于脚本的编写语法便于编写和共享,基于 Windows Workflow Foundation 引擎,相关活动可在 PowerShell 工作流中使用。
2.3 编写基本工作流
基本工作流看起来像函数,但使用
workflow
关键字。可以在模块或脚本中定义工作流。以下是几个示例:
workflow Invoke-MyFirstWorkflow
{
}
workflow Invoke-MyFirstWorkflow
{
## Run step 1
InlineScript
{
$results = Get-Content log.txt | Where-Object { $_ -match "error" }
foreach($result in $results) { ... }
}
## Run step 2
$step2 = InlineScript
{
$userProcesses = Get-Process |
Where-Object Path -notlike ($env:WINDIR + "*")
$userProcesses = $userProcesses | Sort CPU | Select Name,CPU,StartTime
$userProcesses | Select -Last 10
}
$step2
}
workflow Invoke-MyFirstWorkflow
{
## Run step 1
InlineScript { ... }
## Run step 2
InlineScript { ... }
## Run step 3
\\workflowserver\scripts\step3.ps1
}
2.4 不适合使用工作流的场景
- 无需恢复 :如果仅重启脚本就可接受,工作流并无优势。
- 详细/细粒度步骤 :工作流适合协调大块任务,若无法确定主要步骤,难以确定安全的暂停、恢复或重启点。
- 依赖动态状态 :依赖动态状态的脚本在暂停、重启或恢复时可能无法正常工作。
- 单机器管理 :对于单机器管理,使用 PowerShell 远程连接和脚本可能更简单。
- 性能关键 :为保证健壮性,工作流会进行额外处理,可能不适合性能关键场景。
2.5 脚本与工作流的主要概念差异
| 差异类型 | 说明 |
|---|---|
| 检查点 | 编写工作流时需考虑系统可安全暂停和恢复的点。 |
| 任务编排和状态分离 | 工作流是无状态的移动代码,通过向管理节点发送代码来协调操作。 |
| 序列化结果 | 工作流会序列化所有命令调用和操作的结果,以确保可持久化和管理的一致性。 |
| 后台作业 | 工作流作为后台作业运行,使用 *-Job cmdlets 进行交互。 |
2.6 脚本与工作流的主要语法差异
-
命令差异
:支持
Checkpoint-Workflow和Suspend-Workflow命令,部分命令不支持,命令支持更多参数。 -
语言差异
:支持
InlineScript、Parallel和Sequence语句,不支持begin、process和end语句,switch语句、参数默认值有限制,部分语句不支持,不支持基于注释的帮助。
3. 运行工作流
3.1 问题与解决方案
要运行工作流,可以使用
New-PSWorkflowSession
cmdlet 连接到协调工作流的服务器上的
Microsoft.PowerShell.Workflow
端点,导入包含工作流的模块,然后像调用其他 PowerShell 命令一样调用工作流。默认使用
-AsJob
参数,除非工作流预计是短时间运行的。示例如下:
PS > $s = New-PSWorkflowSession -Computername WorkflowServer
PS > Invoke-Command $s { Import-Module C:\Workflows\Workflows.psm1 }
PS > Invoke-Command $s { Invoke-WorkflowMath -Number1 10 -Number2 20 -AsJob }
3.2 工作流运行示例
以下是一个简单的工作流示例:
workflow Invoke-WorkflowMath
{
param($Number1 = 12, $Number2 = 34)
Get-CimInstance -Classname Win32_OperatingSystem
Checkpoint-Workflow
## Multiply two numbers
$Number1 * $Number2
Checkpoint-Workflow
Start-Sleep -Seconds 10
## Divide two numbers
$Number1 / $Number2
}
运行工作流:
PS > Invoke-WorkflowMath
查看工作流参数:
PS > Get-Command Invoke-WorkflowMath -Syntax
3.3 工作流作为作业运行
使用
-AsJob
开关启动工作流,然后使用
Receive-Job
、
Suspend-Job
和
Resume-Job
cmdlets 检索输出和管理状态。PowerShell 会为每个处理的计算机创建一个子作业。
3.4 工作流端点
PowerShell 定义了
Microsoft.PowerShell.Workflow
远程配置,用于工作流的调用和管理。与常规 PowerShell 远程会话不同,该会话会保持活动状态,是健壮、长时间运行任务的理想托管环境。
graph LR
A[开始] --> B[New-PSWorkflowSession连接到服务器]
B --> C[导入工作流模块]
C --> D[调用工作流 -AsJob]
D --> E[使用*-Job cmdlets管理工作流]
E --> F[结束]
4. 暂停和恢复工作流
4.1 问题与解决方案
若要编写用户可暂停和恢复的工作流,或者暂停和恢复已编写的工作流,可在工作流中添加
Checkpoint-Workflow
命令的调用,若工作流可在任意点暂停和恢复,可使用
$PSPersistPreference = $true
。使用
Suspend-Job
和
Resume-Job
cmdlets 来暂停和恢复工作流。示例如下:
workflow Invoke-MyFirstWorkflow
{
## Run step 1
InlineScript { Start-Sleep -Seconds 5; "Done step 1" }
Checkpoint-Workflow
## Run step 2
InlineScript { Start-Sleep -Seconds 5; "Done step 2" }
}
PS > $j = Invoke-MyFirstWorkflow -AsJob
PS > Suspend-Job $j -Wait
PS > Receive-Job $j
Done step 1
PS > Resume-Job $j -Wait
PS > Receive-Job $j -Wait
Done step 2
4.2 操作步骤总结
以下是暂停和恢复工作流的具体操作步骤:
1.
定义工作流
:在工作流中合适的位置添加
Checkpoint-Workflow
命令,标记可安全暂停和恢复的点。
2.
启动工作流
:使用
-AsJob
参数启动工作流,使其以作业的形式运行。
3.
暂停工作流
:使用
Suspend-Job
cmdlet 暂停工作流,并可使用
-Wait
参数等待操作完成。
4.
查看输出
:使用
Receive-Job
cmdlet 查看已完成步骤的输出。
5.
恢复工作流
:使用
Resume-Job
cmdlet 恢复工作流,并可使用
-Wait
参数等待操作完成。
6.
查看最终输出
:再次使用
Receive-Job
cmdlet 查看工作流完成后的最终输出。
4.3 工作流暂停和恢复的优势
工作流的暂停和恢复功能为长时间运行和复杂的任务提供了极大的灵活性和可靠性。通过设置检查点,可在任务执行过程中安全地暂停,处理其他事务后再恢复执行,避免因意外中断而丢失进度。同时,对于多机器任务,可在网络中断等异常情况下暂停工作流,待网络恢复后继续执行,提高了任务的容错能力。
5. 总结
本文详细介绍了 PowerShell 工作流的编写、运行和管理。通过使用
workflow
关键字,可以定义健壮、长时间运行的多机器任务。工作流具有健壮性、长时间运行、多机器处理和可重用性等优势,但并非适用于所有场景。在编写工作流时,需要考虑检查点、任务编排、状态分离、序列化结果和后台作业等概念差异,以及命令和语言方面的语法差异。
运行工作流时,可使用
New-PSWorkflowSession
cmdlet 连接到工作流端点,导入模块并调用工作流。建议将工作流作为作业运行,使用 *-Job cmdlets 进行管理。对于需要暂停和恢复的工作流,可添加
Checkpoint-Workflow
命令,并使用
Suspend-Job
和
Resume-Job
cmdlets 进行操作。
通过合理使用 PowerShell 工作流,可以更高效地自动化管理任务,提高工作效率和可靠性。
| 功能 | 相关命令 | 说明 |
|---|---|---|
| 编写工作流 |
workflow
关键字
| 定义工作流任务 |
| 运行工作流 |
New-PSWorkflowSession
、
Invoke-Command
| 连接到工作流端点,导入模块并调用工作流 |
| 管理工作流 | *-Job cmdlets |
如
Receive-Job
、
Suspend-Job
、
Resume-Job
等
|
| 暂停和恢复工作流 |
Checkpoint-Workflow
、
Suspend-Job
、
Resume-Job
| 设置检查点,暂停和恢复工作流 |
graph LR
A[编写工作流] --> B[运行工作流]
B --> C{是否需要暂停和恢复}
C -- 是 --> D[设置检查点]
D --> E[暂停工作流]
E --> F[恢复工作流]
C -- 否 --> G[工作流完成]
PowerShell工作流指南
超级会员免费看
42

被折叠的 条评论
为什么被折叠?



