You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell中[System.IO.Directory]::EnumerateDirectories()仅返回首个拒绝访问异常?

问题解答

这不是程序Bug,是[System.IO.Directory]::EnumerateDirectories()方法的设计行为。

原因说明

该方法采用延迟枚举(Lazy Evaluation)机制,遍历目录时会逐个生成结果。当遇到第一个UnauthorizedAccessException(访问拒绝)异常时,整个枚举流程会直接终止,不会继续处理后续的目录项。而PowerShell原生的Get-ChildItem cmdlet内部做了额外的异常处理逻辑,遇到访问拒绝时会默认输出警告并继续遍历其他目录,这也是两者行为差异的核心原因。

解决方案:自定义遍历逻辑

如果需要在使用EnumerateDirectories()时跳过访问拒绝的目录并继续遍历,可以自行实现递归遍历逻辑,在每个目录的枚举步骤中单独捕获异常:

function Get-RecursiveDirectories {
    param(
        [Parameter(Mandatory)]
        [string]$RootPath
    )

    try {
        # 枚举当前目录下的所有子目录
        foreach ($dir in [System.IO.Directory]::EnumerateDirectories($RootPath)) {
            # 返回当前目录路径
            $dir
            # 递归遍历子目录
            Get-RecursiveDirectories -RootPath $dir
        }
    }
    catch [System.UnauthorizedAccessException] {
        # 记录访问拒绝的目录,可根据需求调整输出方式
        Write-Warning "访问被拒绝: $RootPath"
    }
}

# 使用示例
Get-RecursiveDirectories -RootPath "C:\"

这个函数会在遇到访问拒绝的目录时捕获异常并输出警告,同时继续遍历其他可访问的目录,不会因为单个异常终止整个遍历流程。

内容的提问来源于stack exchange,提问作者Zaver

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 19:35:53