我已经查看过其他帖子,甚至关注那些我无法正常运行的帖子。
我试图从驱动器中提取所有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]
答案 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”文件夹丢失了。您实际遇到的问题是exclude
对C:\windows
的子文件夹没有任何作用,我猜你的意思是。
关于-Exclude
基本上糟透了,another SO post有Ansgar's answer。只要您了解其局限性,它就会很有用。 {{3}}涵盖了解决这个问题的方法。它将确保C:\windows
树中的任何内容都不会出现在您的结果中。