PowerCLI教程:如何按使用数据存储的主机过滤数据存储
解决PowerShell过滤包含指定主机的数据存储问题
我懂你遇到的痛点了——你之前的代码失效,是因为$_.ExtensionData.Host返回的不是直接的主机对象,而是一堆DatastoreHostMount挂载对象,这些对象里包含了主机的引用信息,但没法直接和$clusterhost对象做比对。咱们得钻到挂载对象里,用主机的唯一标识来匹配才行。
正确的实现步骤
- 先获取目标主机的唯一MoRef ID(这是vSphere中识别对象的核心标识):
# 提取目标主机的Managed Object Reference ID $targetHostId = $clusterhost.ExtensionData.MoRef.Value
- 过滤数据存储时,检查每个数据存储的挂载主机列表里是否包含这个ID:
# PowerShell 5.x及以上通用写法 $filteredDatastores = Get-Datastore | Where-Object { # 遍历当前数据存储的所有挂载主机,判断是否存在匹配的ID $_.ExtensionData.Host | ForEach-Object { if ($_.Host.Value -eq $targetHostId) { return $true } } }
如果你的环境用的是PowerShell 7+,还可以用更简洁的写法(利用数组属性直接判断):
# PowerShell 7+ 简化写法 $filteredDatastores = Get-Datastore | Where-Object { $_.ExtensionData.Host.Host.Value -contains $targetHostId }
为什么之前的代码不生效?
你原来用-contains $clusterhost,是在拿完整的主机对象和DatastoreHostMount对象做比对——这俩根本不是同一类型的对象,自然匹配不上。必须提取两者共有的唯一标识(也就是主机的MoRef ID),才能准确判断数据存储是否被目标主机挂载。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

