当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 构建 PowerShell 异步函数的快速指南

作者:精品下载站 日期:2024-12-14 12:40:02 浏览:16 分类:玩电脑

构建 PowerShell 异步函数的快速指南


最常见的 PowerShell 函数是执行代码并在完成后将控制权返回到控制台的函数。这称为同步代码或 PowerShell 异步函数。这意味着在该函数执行完成之前,不会继续执行进一步的代码。

有时,函数内部的代码可能需要一段时间,并且您不想等待它完成。在这种情况下,您需要构建立即返回控制权但继续在后台运行线程的函数。

例如,我使用异步函数来清理 Azure VM。该过程最多需要 5 分钟,因为它必须关闭虚拟机、删除虚拟机并清理所有连接的磁盘。让我的自定义函数返回后台作业对象并在我有时间时对其进行监视要容易得多。

PowerShell 异步函数可以用几种不同的方式编写;工作流程、并行运行空间和作业等等。每个都有其优点和缺点。但是,我通常使用作业来运行异步代码。我这样做是因为它们通常易于管理并且对我来说很直观。

假设我需要一个删除 Azure 虚拟机的函数。在此函数中,我需要删除虚拟机,这需要几分钟时间并执行一些其他清理任务。

我想构建一个函数,它允许我返回后台作业对象,但也让用户可以选择等待该函数(如果需要)。

始终提供等待选项,以防万一您开发的脚本可能需要该功能。

正常构建代码

使用 Azure PowerShell cmdlet Remove-AzVM 删除 Azure 中的 VM 非常简单,该命令需要一些参数; 名称ResourceGroupName

这将删除我的 Azure VM:Remove-AzVM -Name MYVM -ResourceGroupName MYRG

完毕。我现在有了删除 Azure VM 的“典型”代码。

构建函数参数

要围绕此构建一个在后台运行的函数,我需要构建它以支持 Remove-AzVm 所需的参数,以便 NameResourceGroupName

function Remove-MyAzureRmVM
{
    param (
        [Parameter(Mandatory)]
        [string]$Name,

        [Parameter(Mandatory)]
        [string]$ResourceGroupName
    )
    Remove-AzureRmVm -Name $Name -ResourceGroupName $ResourceGroupName
}

我现在有一个简单的代理函数,它将两个参数传递给 Remove-AzVm cmdlet。这可行,但效果不是很好,因为它是同步运行的。我们需要将其变成 PowerShell 异步函数并实现 PowerShell 作业支持,但也为用户提供同步运行它的选项(如果他们愿意)。

实施 PowerShell 异步作业支持

为此,我们需要将代码放入脚本块中。这使我们不仅可以将其传递给 Start-Job,而且还可以在用户想要等待操作完成时执行它。由于 Remove-AzVm 需要函数中的一些参数,因此我们还必须将这些参数添加到脚本块中。

$scriptBlock = {
    param ($Name,$ResourceGroupName)
    Remove-AzureRmVm -Name $Name -ResourceGroupName $ResourceGroupName
    ## Other stuff here
}

将代码放入脚本块后,您只需将其传递给 Start-Job,然后就可以开始比赛了!请务必根据需要传递参数。

Start-Job -ScriptBlock $scriptBlock -ArgumentList @($VMName,$ResourceGroupName)

提供同步操作支持

由于代码位于脚本块中,因此我们现在还可以通过使用&符号并再次传入参数来自行执行此代码。

& $scriptBlock -VMName $VMName -ResourceGroupName $ResourceGroupName

现在我们有了两种执行代码的方法。我们现在需要做的就是为函数提供一种方法来指定我们想要的函数。

默认情况下,我希望代码在后台作业中执行,但我希望可以选择在需要时同步执行它。实现此功能的一个好方法是使用 Wait 参数作为开关类型。这使我能够在需要时快速“打开”同步行为。

Remove-MyAzVM -VMName MYVM -ResourceGroupName MYRG -Wait

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯