PowerCLI使用Select别名时输出顺序异常问题咨询
PowerCLI中Select-Object导致输出顺序混乱的原因
你遇到的这个顺序问题,根源在于PowerCLI对虚拟机对象的默认格式化逻辑,和Select-Object生成的自定义对象的处理方式完全不同,具体拆解一下:
直接输出虚拟机对象时的有序性:
当你运行Get-VM | Where-Object { $_.PowerState -eq 'PoweredOn' }并直接输出结果时,PowerCLI为VirtualMachine这个特定类型的对象定义了专属的格式化规则(这些规则存在于PowerCLI的内置配置文件中)。这个规则会自动帮你按Name属性对结果进行排序后再显示,所以不管你的查询规模多大,看到的都是整齐的字母顺序,你会觉得“输出保持有序”。使用Select-Object后顺序混乱的原因:
一旦你加上| Select Name,本质是把原始的虚拟机对象转换成了只包含Name属性的自定义对象(PSCustomObject)。这时候PowerShell会放弃PowerCLI的专属格式化规则,转而使用通用的自定义对象显示逻辑——它不会自动帮你排序,只会严格按照Get-VM从vCenter API获取到的原始顺序输出。而vCenter返回的虚拟机顺序是由它内部的存储索引、检索逻辑决定的,不一定是你期望的字母顺序,所以看起来就“混乱”了。
解决办法
如果你想保留只显示Name属性的需求,同时让输出保持有序,只需要显式添加排序步骤即可:
Connect-VIServer vcenter $myvm=Read-Host "Enter the VM name or names using wildcards to update" write-host "VM's to update: " get-vm $myvm | Where-Object {($_.PowerState -eq 'PoweredOn')} | Sort-Object Name | select Name
通过Sort-Object Name强制按名称排序,就能确保无论处理哪种对象类型,输出顺序都是稳定符合预期的。
内容的提问来源于stack exchange,提问作者casperinmd
相关产品推荐
相关产品推荐

