PowerShell获取子文件夹列表时包含初始目录的实现方案
解决PowerShell获取包含初始目录的目录集合问题
问题根源
Get-ChildItem -Path $initialPath -Recurse -Directory仅返回指定目录的子文件夹,不包含初始目录本身;当目标目录无下属子文件夹时,该命令返回空集合,导致后续处理逻辑无法执行。直接尝试将初始目录的DirectoryInfo对象与该命令结果相加时,会因DirectoryInfo类型不支持加法操作报错:Method invocation failed because [System.IO.DirectoryInfo] does not contain a method named 'op_Addition'。
可行解决方案
方案1:数组组合法(最简洁)
先单独获取初始目录的DirectoryInfo对象,将其转为数组后,再与递归获取的子文件夹集合相加:
# 获取初始目录对象 $initialDir = Get-Item -Path $initialPath # 组合初始目录与所有子目录 $allDirs = @($initialDir) + (Get-ChildItem -Path $initialPath -Recurse -Directory)
@($initialDir)将单个DirectoryInfo对象转为数组,确保可以与Get-ChildItem返回的集合(数组类型)执行加法操作。- 无论初始目录是否有子文件夹,
$allDirs都会包含初始目录本身。
方案2:.NET API 调用法
直接使用.NET的DirectoryInfo类方法枚举子目录,再与初始目录组合:
# 初始化DirectoryInfo对象 $initialDir = [System.IO.DirectoryInfo]$initialPath # 获取所有子目录(递归)并与初始目录组合 $allDirs = @($initialDir) + $initialDir.EnumerateDirectories("*", [System.IO.SearchOption]::AllDirectories)
- 此方法性能略优,尤其是处理大量目录时,
EnumerateDirectories会延迟加载结果。
关于“父目录过滤”思路的说明
无需绕路到父目录再过滤同级目录——直接获取初始目录对象的方式更高效、简洁,避免了额外的过滤逻辑。如果一定要用父目录的方式,示例如下(不推荐):
$parentDir = Split-Path -Path $initialPath -Parent $allDirs = Get-ChildItem -Path $parentDir -Directory | Where-Object FullName -eq $initialPath $allDirs += Get-ChildItem -Path $initialPath -Recurse -Directory
这种方法多了一步父目录遍历和过滤,不如前两种方案直接。
内容的提问来源于stack exchange,提问作者miguello
相关产品推荐
相关产品推荐

