如何让Hyper-V的Get-VM命令输出统一的非本地化状态值?
解决方案:获取Hyper-V虚拟机非本地化状态值
直接使用虚拟机对象的OperationalStatus属性,而非Status属性,就能拿到不受系统语言影响的枚举值:
方法1:直接读取枚举状态
OperationalStatus返回的是[Microsoft.HyperV.Powershell.VMOperationalStatus]枚举类型的数组,每个成员都是英文名称(如Ok、MergingDisks),完全不依赖系统本地化设置:
# 获取第一台虚拟机的所有操作状态枚举 $vmOperationalStatus = (Get-VM)[0].OperationalStatus # 检查是否包含特定状态 if ($vmOperationalStatus -contains [Microsoft.HyperV.Powershell.VMOperationalStatus]::Ok) { Write-Host "虚拟机处于正常运行状态" } # 转换为枚举对应的整数值 $statusValue = [int]$vmOperationalStatus[0]
方法2:从本地化Status字符串反推枚举(如果必须用Status)
如果因为某些场景只能拿到本地化的Status字符串,可以通过枚举成员的DisplayName属性匹配,反向获取英文枚举名:
$localizedStatus = (Get-VM)[0].Status $enumType = [Microsoft.HyperV.Powershell.VMOperationalStatus] # 匹配对应枚举成员 $targetEnum = $enumType.GetFields() | Where-Object { $_.GetValue($null).DisplayName -eq $localizedStatus } | Select-Object -ExpandProperty Name -First 1 # 输出结果,比如法语系统下会返回"Ok"对应"Fonctionnement normal" Write-Host "对应的非本地化状态名:$targetEnum"
关键说明
Status属性是给用户看的本地化友好名称,而OperationalStatus是Hyper-V底层使用的枚举值,不受系统语言影响,是脚本中判断状态的首选属性。- 你的PowerShell 5.1环境完全支持这个属性,无需修改会话语言或额外配置。
内容的提问来源于stack exchange,提问作者Orsiris de Jong
相关产品推荐
相关产品推荐

