Get-ChildItem para 2-3 níveis

1

Então, estou tentando extrair uma listagem da estrutura de pastas DFS-N para um cliente. No entanto, por várias razões, vou limitar a 2 níveis a partir de $ share. Além disso, os mais de 40 servidores de arquivos ainda não têm o PowerShell 5, portanto, usar o comutador de de-profundidade não é uma opção no momento.

O problema que estou tendo é que o método que eu li deve limitá-lo, não está limitando-o corretamente.

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

No entanto, quando olho para a saída, ela contém o que parece ser cada pasta em $ path, algumas com 3 níveis de profundidade, não apenas 2. Não é um grande problema, mas estou imaginando se alguém sabe o que estou fazendo errado? Por exemplo, $ share está sendo definido como:

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

Mas estou vendo resultados semelhantes, por exemplo: \\ namespace \ site_data \ SOX \ Activo Fijo 2016 \ Septiembre

    
por Steve Freeman 26.05.2017 / 22:34

1 resposta

2

Que tal agarrar manualmente apenas o primeiro nível e, em seguida, repetir o segundo nível como um passo? Fiz o seu código para imprimir as ACLs em uma função e passei manualmente pelos três primeiros níveis. Se os itens no primeiro nível forem pastas ( $_.ISPSContainer ), eles obterão seus itens filhos extraídos e processados e outro nível dos mesmos para obter o próximo nível. Idealmente, você não iria reutilizar o código, ele deveria ser refatorado em outra função para fazer a recursão, mas isso exigiria a passagem de um parâmetro que você poderia dizer quantos níveis mais para puxar. Então, cada loop poderia diminuir esse contador e chamar a si mesmo se o $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 $_
    }
}
    
por 26.05.2017 / 23:49

Tags