gpt4 book ai didi

powershell - 让 Azure powershell 等待任务完成

转载 作者:行者123 更新时间:2023-12-05 05:16:10 25 4
gpt4 key购买 nike

我有一个 powershell 脚本,可以使用 Jenkins 在特定时间并行停止/启动 VM。此脚本使用 -AsJob powershell cmdlet,这样虚拟机在 Jenkins 输出中显示它们已停止,但实际上它们正在 Azure 门户中取消分配。

我还有一个 5 分钟的 sleep 计时器来获取 Get-AzureRmVM -Status 命令。

问题:- 有没有一种方法可以循环它,让我可以检查虚拟机的状态,如果虚拟机未处于“已释放”或“正在运行”状态,则脚本会在大约一分钟后返回。一旦虚拟机最终处于释放或运行状态,脚本/作业就会成功退出。

代码片段

$JobList = @()

foreach ($VM in $vms)
{
if ($env:OPTION -eq "start")
{
Write-Output "Starting :- $($VM.Name) in $($VM.ResourceGroupName)"

$JobList += Start-AzureRmVM -ResourceGroupName $VM.ResourceGroupName -Name $VM.Name -AsJob -Verbose

Write-Output "$($VM.Name) has started successfully `n"
Write-Output "--------------------------------------------------"
}

elseif ($env:OPTION -eq "stop")
{
Write-Output "Deallocating :- $($VM.Name) in $($VM.ResourceGroupName)"

$JobList += Stop-AzureRmVM -ResourceGroupName $VM.ResourceGroupName -Name $VM.Name -Force -AsJob -Verbose

Write-Output "$($VM.Name) has been deallocated successfully `n"
Write-Output "--------------------------------------------------"
}

else
{
Write-Output "ERROR!!! No option selected, select an option"
}

}

sleep 300

Write-Output "`n##############################################"
Write-Output "### Writing Status of VMs to Workspace ###"
Write-Output "##############################################"
Get-AzureRmVM -Status | Where-Object {($_.tags.ManagedBy -eq "blaah") -And ($_.tags.Environment -eq "stage")}

编辑 - 此代码检查虚拟机的状态以查看其是否已释放。我无法让它再次运行循环,因为虚拟机处于运行状态。 screenshot

$vms = (Get-AzureRmResource | Where-Object {($_.tags.ManagedBy -eq "blaah") -And ($_.tags.Environment -eq "Stage")}

foreach ($VM in $VMs) {

$vmDetail = Get-AzureRmVM -Name $VM.Name -ResourceGroupName $VM.ResourceGroupName -Status

foreach ($vmDetail in $vmDetail.Statuses[1]) {

$VMStatusDetail = $vmDetail.DisplayStatus

if ($VMStatusDetail -ne "Stopped") {

Write-Output "Waiting for $($VM.Name) to deallocate"
Write-Output "State:- $($VM.Name) is $VMStatusDetail"

start-sleep -s 5
}
else {
Write-Output "State:- $($VM.Name) is $VMStatusDetail"
}

}
}

最佳答案

如果将 Stop-AzureRMVM 作为作业抛出,并将输出保留在名为 $JobList 的作业数组中,则所有作业启动后,在循环的末尾和外部,您可以添加以下命令来等待作业完成。

Write-Host $JobList
$JobList| Get-Job | Wait-Job | Receive-Job | Format-Table -AutoSize

关于powershell - 让 Azure powershell 等待任务完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50723031/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com