【问题标题】:Powershell script to get list of Running VM's and stop them用于获取正在运行的 VM 列表并停止它们的 Powershell 脚本
【发布时间】:2022-01-05 18:13:06
【问题描述】:

我正在使用这个脚本,但它会收集所有的虚拟机并一一停止它,即使虚拟机已经处于停止状态

$vm = Get-Azvm 

foreach($vms in $vm)

{
    
    $resource = Get-Azvm | where {$_.Statuses -eq "Running"}

    if($resource -ne $null)
    {  
        Write-Output "Stopping virtual machine..." + $vms
        Stop-AzVM -ResourceGroupName $resource.ResourceGroupName -Name $vms -Force
    }   
    else
    {
        Write-output "Virtual machine not found:" + $vms
    }
}

【问题讨论】:

  • 您确定Statuses 是返回对象的现有属性吗?通过查看 MS Docs,您似乎需要使用 -Status 开关,以便 cmdlet 返回该属性,此外,Satutes 似乎是一个嵌套属性,即$vm.Disks[0].Status[0].DisplayStatus
  • 如果您不确定我的意思,请尝试以下操作,$vm[0] | Select-Object * 并在必要时将返回的对象添加到您的问题混淆信息中。
  • @SantiagoSquarzon 你对-Status 的看法是对的,但对.Statuses 却不是。传递-Status 时,cmdlet 输出PSVirtualMachineInstanceView 确实有Statuses property
  • 很高兴知道@zett42,使用开关时对象看起来像Example 2吗?
  • $vm = Get-AzVM -Name 'OneVMNameHere' -Status => $vm.Statuses.GetType()$vm.Statuses | Get-Member。这两个输出都将帮助我们了解如何为您提供帮助。

标签: azure powershell


【解决方案1】:

基于上述共享需求,我们修改了PowerShell脚本来检查虚拟机状态(是否正在运行),如果虚拟机正在运行,则需要使用stop-Azvm cmdlet 将其停止。

在我们的本地环境中检查了以下脚本(在测试时我们将资源组标志传递给 Get-Azvm ),它工作正常。

$vm = Get-Azvm -Status

foreach($vms in $vm)
{
   $statuscheck = Get-AzVM -ResourceGroupName $vms.ResourceGroupName -Name $vms.Name -Status 
    if($statuscheck.Statuses.DisplayStatus[1] -eq "VM running")
    {  

        Write-Output "Stopping virtual machine...$($vms.Name)"

        Stop-AzVM -ResourceGroupName $vms.ResourceGroupName -Name $vms.Name -Force
    }   
    else
    {
        Write-output "Virtual machine $($vms.Name) is already in stopped state"
    }
}

以下是示例输出以供参考:

【讨论】:

  • 谢谢,这个脚本绝对完美
猜你喜欢
  • 1970-01-01
  • 2023-03-18
  • 2011-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-11
  • 2018-05-11
相关资源
最近更新 更多