1

Я хочу простой способ исключить системную папку из поисков в 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. -Включить * .txt -Включить '$ mysys' -Recurse -Dept ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~ + CategoryInfo: PermissionDenied: (C:\Windows\Syst ... es\WMI\RtBackup: String) [Get-ChildItem], UnauthorizedAccessExcept ion + FullyQualifiedErrorId: DirUnauthorizedAccessError, Microsoft.PowerShell.Команды.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 ответ1

0

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

$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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .