获取运行中Azure VM并批量停止的PowerShell脚本异常问题咨询
问题原因
- 原脚本未正确拉取VM实时运行状态:
Get-AzVM默认仅返回VM的基本配置信息,不会返回运行状态,必须添加-Status参数才能获取电源状态属性。 - 状态匹配逻辑错误:
Statuses是数组类型,不能直接用-eq "Running"做等值匹配,Azure VM的运行状态标识为PowerState/running,需要用数组包含逻辑做判断。 - 循环判断逻辑错误:循环内每次都拉取全量VM的运行状态,只要存在任意一台运行中的VM,就会对当前遍历的所有VM执行停止操作,完全没有校验当前VM的实际状态。
- 参数传递错误:原脚本调用
Stop-AzVM时传入的参数来源错误,会导致资源不匹配的执行异常。
修正后可用脚本
# 拉取所有Azure VM并获取实时运行状态 $allVms = Get-AzVM -Status foreach ($vm in $allVms) { # 判断当前VM是否处于运行状态 $isRunning = $vm.Statuses.Code -contains "PowerState/running" if ($isRunning) { Write-Output "正在停止虚拟机:$($vm.Name),所属资源组:$($vm.ResourceGroupName)" Stop-AzVM -ResourceGroupName $vm.ResourceGroupName -Name $vm.Name -Force } else { Write-Output "跳过操作:虚拟机 $($vm.Name) 已处于停止状态" } }
优化说明
- 仅拉取一次VM全量状态,避免循环内重复调用Azure API,降低调用频次提升执行效率
- 单台VM状态判断准确,仅对运行中的VM执行停止操作
- 参数取值直接从当前遍历VM对象获取,不会出现资源不匹配问题
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

