2015-06-19 3 views
2

Я проверял другие сообщения и даже после этого я не могу заставить это функционировать.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] 
+0

Попробуйте Get-ChildItem 'C: \ *' -Exclude 'Windows' –

+0

Спасибо, но это тоже не работает. Командная строка, которую я вводил, -. \ NTFSPermissions.ps1 "C: \" | Export-Csv C: \ Permissions \ output.csv -NoTypeInformation. Также попробовали Исключить 'Windows' –

+0

Попробуйте вызвать скрипт с \ NTFSPermissions.ps1 "C: *" | Export-Csv C: \ Permissions \ output.csv -NoTypeInformation –

ответ

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

Пара указывает на параметр -Exclude. Хотя он явно не упоминает об этом в документации, похоже, работает на основе файла и каталога имена .... не полные пути сами. В результате этого он никоим образом не рекурсивно работает с каталогами, которые, я думаю, являются вашей фактической загадкой.

С C:\Windows\* не является допустимым именем каталога, поэтому он не фильтрует ничего. Jisaak предложение об изменении $exclude просто «окна» действительно работало в некотором смысле. Если вы посмотрели на свой результат, вы заметили бы, что фактическая папка «c: \ windows» отсутствовала. На самом деле у вас есть проблема с тем, что exclude ничего не делает для подпапок C:\windows, которые я угадаю, это то, что вы намеревались.

Существует another SO post о том, как -Exclude в основном отстой. Это может быть полезно, если вы понимаете его ограничения. Ansgar's answer охватывает все вокруг. Это гарантирует, что ничто в дереве C:\windows не окажется в ваших результатах.

 Смежные вопросы

  • Нет связанных вопросов^_^