Get-ChildItem(2-3 级)

Get-ChildItem(2-3 级)

因此,我尝试为客户端提取 DFS-N 文件夹结构的列表。但是,出于各种原因,我将限制其深度为 $share 的 2 级。此外,40 多个文件服务器尚未安装 PowerShell 5,因此目前无法使用 -depth 开关。

我遇到的问题是我读到的方法应该限制它,但并没有正确地限制它。

Get-ChildItem -path $share,$share\*,$share\*\* | ForEach-Object {
        $Path  = "$_"

        $Acl = Get-Acl $Path
        $Acl | 
            Select-Object -ExpandProperty Access | 
            Add-Member -MemberType NoteProperty -Name Path -Value $Path -PassThru  |
            Add-Member -MemberType NoteProperty -Name Owner -Value $Acl.Owner -PassThru

但是,当我查看输出时,它似乎包含 $path 下的每个文件夹,其中一些文件夹深度为 3 级,而不仅仅是 2 级。这不是什么大问题,但我想知道是否有人知道我做错了什么?例如,$share 定义为:

$share = "\\" + $server + "\" + $site + "_Data"

但我看到的结果类似如下:\\namespace\site_data\SOX\Activo Fijo 2016\Septiembre

答案1

如何手动抓取第一级,然后循环第二级作为一个步骤?我将您的代码用于将 ACL 打印到函数中,并手动逐步抓取前三个级别。如果第一级中的项目是文件夹($_.ISPSContainer),则会提取和处理它们的子项目,然后提取同一级的另一个子项目以获得下一个级别。理想情况下,您不会重复使用代码,应该将其重构为另一个函数来执行递归,但这需要传递一个参数,您可以告诉它要提取多少个级别。然后,每个循环都可以减少该计数器,并在 时调用自身$counter -gt 0

Function Print-Acl {
    param(  
    [Parameter(
        Position=0, 
        Mandatory=$true)
    ]
    [String[]]$Path
    ) 

    $Acl = Get-Acl $Path
    $Acl | 
        Select-Object -ExpandProperty Access | 
        Add-Member -MemberType NoteProperty -Name Path -Value $Path -PassThru  |
        Add-Member -MemberType NoteProperty -Name Owner -Value $Acl.Owner -PassThru
}

Get-ChildItem -path $share | ForEach-Object {
    # First Level
    if ($_.PSIsContainer) {
        Print-Acl -Path $_.FullName
        Get-ChildItem -Path $_.FullName | ForEach-Object {
            # Second Level
            if ($_.PSIsContainer) {
                # Third level
                Print-Acl -Path $_.FullName
                Get-ChildItem -Path $_.FullName | ForEach-Object {
                    Print-Acl -Path $_.FullName
                }
            }
            else {
                Print-Acl -Path $_.FullName
            }
        }
    }
    else {
        Print-Acl -Path $_
    }
}

相关内容