首页 > 解决方案 > 同时运行几个Powershell后台作业,结果不如预期

问题描述

我尝试在后台运行几个 Azure cmdlet(我通过开关参数“-asJob”和 Start-Job cmdlet 进行了尝试),我使用某些键将 cmdlet 操作推送到哈希表,然后迭代正在运行的作业。问题是所有 cmdlet 同时将状态更改为“已完成”,即使哈希表中的某些作业实际上以“已完成”结束。
感觉所有工作都以最后一个结束工作结束。下面我写了一些有问题的示例代码

$vmssInstances = Get-AzVmssVM -ResourceGroupName $(agentPoolName) -VMScaleSetName $(agentPoolName)
$groupedVmssInstancesByComputerName = @{}
foreach($vmssInstance in $vmssInstances) 
{
    $groupedVmssInstancesByComputerName[$vmssInstance.OsProfile.ComputerName] = @{vmmsInstance = $vmssInstance; agents = @(); isFullyUpdated = $false}
}
foreach($key in $groupedVmssInstancesByComputerName.Keys)
{
    $vmssInstance = $groupedVmssInstancesByComputerName[$key]["vmmsInstance"]
    Write-Host "Trying to reimage instance $($vmssInstance.InstanceId)..."
    $groupedVmssInstancesByComputerName[$key]["reimageOperation"] =   Set-AzVmssVM -Reimage -InstanceId $vmssInstance.InstanceId -ResourceGroupName $(agentPoolName) -VMScaleSetName $(agentPoolName) -AsJob
}
while($true) 
{
    Get-Job
    Start-Sleep -Seconds 10
}

我无法理解发生了什么。也许我不知道powershell的一些功能。请帮帮我,伙计们!

标签: powershellazure-powershell

解决方案


尝试使用 Wait-Job - 禁止命令提示符,直到会话中运行的一个或所有 PowerShell 后台作业完成。

Get-Job | Wait-Job

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/wait-job?view=powershell-6


推荐阅读