Как исключить системный каталог с помощью 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