Get-ChildItem查询VMware数据存储返回路径重复如何解决
问题判定
- 不属于使用方式错误,也不是cmdlet的预期正常输出,这是VMware PowerCLI模块中
vmstores:PowerShell提供程序的已知bug。 - 触发场景为:对vmstores psdrive下的深层嵌套目录执行
Get-ChildItem,同时搭配-Recurse和-Include参数时,通用PowerShell文件系统属性FullName/PSPath/PSParentPath会错误重复拼接传入的起始查询路径段;而FolderPath/DatastoreFullPath是PowerCLI为数据存储文件对象单独实现的属性,不受该provider层bug影响,因此输出正常。该bug在PowerCLI 6.x、7.x的多个历史版本中均存在复现记录。
可选解决方案
按推荐优先级排序:
- 使用PowerCLI原生数据存储文件查询cmdlet替代vmstores路径遍历,稳定性最高,无路径异常问题:
Get-Datastore -Name "DATASTORE" | Get-DatastoreFile -Path "vCloud01/media/c7129498-3290-4a7e-a7e1-5c80499e729f" -Recurse | Where-Object Name -like "*.iso" | Select-Object FullName - 调整
Get-ChildItem的参数写法规避bug:不要将深层目录直接传入-Path参数,可先切换到目标目录再执行递归查询,同时将-Include替换为-Filter(-Filter由provider层直接实现,不会触发路径拼接逻辑异常):Set-Location "vmstores:/IP@443/vCenter/DATASTORE/vCloud01/media/c7129498-3290-4a7e-a7e1-5c80499e729f" Get-ChildItem -Recurse -Filter *.iso | Select-Object FullName - 路径修正兜底方案:如果不想调整现有查询逻辑,可直接通过字符串替换移除重复的路径段,处理逻辑简单可靠:
$fixedPathPrefix = "vmstores:/IP@443/vCenter/DATASTORE/vCloud01/media/c7129498-3290-4a7e-a7e1-5c80499e729f" Get-ChildItem -recurse -Path $fixedPathPrefix -include *.iso | ForEach-Object { $_.FullName = $_.FullName.Replace("$fixedPathPrefix/$fixedPathPrefix", $fixedPathPrefix) $_ } | Select FullName
内容的提问来源于stack exchange,提问作者Harry Allen
相关产品推荐
相关产品推荐

