为何PowerShell命令中Select -First 1无法生效?
Windows故障转移集群PowerShell命令异常问题分析
问题场景
在Windows故障转移集群环境中执行以下PowerShell命令:
PS C:\Users\administrator.DEV> Get-ClusterResource *disk* Name State OwnerGroup ResourceType ---- ----- ---------- ------------ Cluster Disk 1 Online Available Storage Physical Disk Cluster Disk 2 Online Cluster Group Physical Disk Cluster Disk 3 Online Available Storage Physical Disk PS C:\Users\administrator.DEV> (Get-ClusterResource *disk*).GetType() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True Object[] System.Array PS C:\Users\administrator.DEV> (Get-ClusterResource *disk*)[0].GetType() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True False ClusterResource Microsoft.FailoverClusters.PowerShell.ClusterObject
可见存在3个磁盘资源,但执行Get-ClusterResource *disk* | select -First 1却得到空输出。
原因分析
这是由于Get-ClusterResource返回的ClusterResource对象集合在管道传输时存在特殊行为,故障转移集群模块的部分PowerShell cmdlet返回的对象,其管道序列化逻辑与常规PowerShell集合不同,导致Select-Object -First 1无法正确识别并提取集合中的元素。
解决方法
可以通过以下两种方式获取首个磁盘资源:
方式1:转为常规数组后通过索引获取
先将命令结果强制转为PowerShell数组,再通过索引直接访问第一个元素:
# 分步实现 $diskResources = @(Get-ClusterResource *disk*) $firstDisk = $diskResources[0] # 一行命令实现 @(Get-ClusterResource *disk*)[0]
方式2:使用ForEach-Object中断循环提取首个元素
利用ForEach-Object遍历集合,输出第一个元素后直接中断循环:
Get-ClusterResource *disk* | ForEach-Object { $_; break }
内容的提问来源于stack exchange,提问作者Fajela Tajkiya
相关产品推荐
相关产品推荐

