Get-ChildItem递归排除NOT排除文件夹

时间:2015-06-19 09:02:00

标签: powershell get-childitem

我已经查看过其他帖子,甚至关注那些我无法正常运行的帖子。

我试图从驱动器中提取所有ACL信息但排除Windows文件夹。

这是我正在使用的代码,但它总是尝试包含该文件夹。有人能告诉我为什么这不起作用吗?

我也试过Where-Object

$containers = Get-ChildItem -Path $Path -Recurse -Exclude $exclude |
              ? {$_.FullName -notmatch '\\windows\\?'}

主要代码:

function Get-PathPermissions {
    param ( [Parameter(Mandatory=$true)] [System.String]${Path} )

    begin {
        $root = Get-Item $Path 
        ($root | Get-Acl).Access |
            Add-Member -MemberType NoteProperty -Name "Path" -Value $($root.fullname).ToString() -PassThru
    }
    process {
        $exclude = @('C:\Windows\*')
        $containers = Get-ChildItem -Path $Path -Recurse -Exclude $exclude |
                      ? {$_.psIscontainer -eq $true}
        if ($containers -eq $null) {break}
            foreach ($container in $containers)
            {
            (Get-Acl $container.FullName).Access |
                ? { $_.IsInherited -eq $false } |
                Add-Member -MemberType NoteProperty -Name "Path" -Value $($container.fullname).ToString() -PassThru
            }

    }
}

Get-PathPermissions $args[0]

2 个答案:

答案 0 :(得分:2)

使用-notmatch '\\windows\\?'进行过滤应该有效。不过,我会使用完整路径来避免潜在的不受欢迎的排除:

$containers = Get-ChildItem -Path $Path -Recurse |
              ? { $_.FullName -notmatch '^c:\\windows\\?' -and $_.PSIsContainer}

在PowerShell v3或更高版本上,您还可以使用-Directory开关将结果限制为目录:

$containers = Get-ChildItem -Path $Path -Recurse -Directory |
              ? { $_.FullName -notmatch '^c:\\windows\\?' }

答案 1 :(得分:1)

关于-Exclude参数的几点。虽然它没有在文档中明确提及它似乎基于文件和目录 名称 ....而不是完整路径本身。因此,它不会以任何方式递归地使用我认为是您实际难题的目录。

由于C:\Windows\*不是有效的目录名,因此它不会过滤任何内容。 Jisaak建议将$exclude更改为“只是”窗口“在某种意义上确实有效。如果您查看输出,您会注意到实际的“c:\ windows”文件夹丢失了。您实际遇到的问题是excludeC:\windows的子文件夹没有任何作用,我猜你的意思是。

关于-Exclude基本上糟透了,another SO postAnsgar's answer。只要您了解其局限性,它就会很有用。 {{3}}涵盖了解决这个问题的方法。它将确保C:\windows树中的任何内容都不会出现在您的结果中。