Как исключить системный каталог с помощью Powershell

Я хочу простой способ исключить системную папку из поисков в PowerShell.

Я использую следующий скрипт:

$mysys = 'c:\windows'    
PS C:\> Get-ChildItem -path . -Include *.txt -Exclude '$mysys' -Recurse

Я в основном хочу, чтобы что-либо в c: \ windows было полностью проигнорировано, однако, когда я запускаю поиск, я постоянно получаю ошибки, поскольку он ищет в c:\windows; и в некоторых случаях также выдает результаты, которые он нашел.

Ошибка: (почему это даже происходит в c: \ windows, когда я его исключил)

Get-ChildItem : Access to the path 'C:\Windows\System32\LogFiles\WMI\RtBackup' is denied. At line:1

char: 1 + Get-ChildItem -path. -Include *.txt -Exclude '$ mysys' -Recurse -Dept... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~ + CategoryInfo: PermissionDenied: (C:\Windows\Syst...es\WMI\RtBackup:String) [Get-ChildItem], UnauthorizedAccessExcept ion + FullyQualifiedErrorId: DirUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand

Например, он включает в себя: (все это должно быть исключено) (в основном все, что находится в каталоге c:\windows)

> >     Directory: C:\Windows\WinSxS\amd64_microsoft-windows-c..iser-inboxdatafiles_31bf3856ad364e35_10.0.14393.0_none_9eeac2cef7a25999
> 
> 
> Mode                LastWriteTime         Length Name                 
> 
> ----                -------------         ------ ----                                                                                
> -a----        7/16/2016   6:42 AM         855814 hwcompat_RS1.txt                                                                    
> ------        7/16/2016   6:42 AM           1764 hwexclude_RS1.txt                                                                   
> ------        7/16/2016   6:42 AM           1327 wucompat.txt

Я в основном хочу сделать рекурсивный поиск в c: \ и затем исключить все, что я не хочу. Начиная с c: \ windows и всего, что под ним.

1 ответ

Предложите пару небольших исправлений синтаксиса (эти изменения не решат вашу проблему, просто лучше синтаксис):

$mysys = 'c:\windows\*'    
Get-ChildItem -path . -Include *.txt -Exclude $mysys -Recurse

Так или иначе...

почему это даже происходит в c:\windows, когда я его исключил

Вы исключаете только вещи в "C:\windows" из результатов Get-ChildItem. GCI по-прежнему нужно проверять папки, которые вы указали, чтобы проверить, чтобы убедиться, что что-то соответствует, что вызывает ошибку "Отказано в доступе".

Если вы хотите полностью избежать папок, к которым у вас нет доступа, вам нужно будет создать список папок, которые вы хотите проверить с помощью GCI, вместо того, чтобы просто сказать GCI проверить все по текущему пути.

Единственный способ сделать это - по сути, одна и та же процедура: проверить каждую папку и сохранить список тех, на которые вы не получаете доступ, затем использовать этот список с GCI. В конце концов, вы все равно пытаетесь получить доступ к папкам (и выкидываете ошибку), так что в принципе это не выгодно (ожидайте дополнительной сложности).

Если вам просто не нравится видеть красные ошибки во время выполнения команды, вы можете использовать -ErrorAction параметр и сказать GCI, чтобы продолжить молча при ошибке. Например:

Get-ChildItem -path . -Include *.txt -Exclude $mysys -Recurse -ErrorAction SilentlyContinue
Другие вопросы по тегам