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

1073
gsb005

Я хочу простой способ исключить системную папку из поисков в 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
Опция -exclude Get-ChildItem работает только с листьями, а не с элементами пути. Вы должны будете отправлять трубку туда, где исключить. LotPings 7 лет назад 0
Можете ли вы дать мне пример? gsb005 7 лет назад 0
См. [Ответ на этот вопрос] (https://superuser.com/questions/1190355/powershell-get-childitem-include-exclude-simple-script-not-working-properly) LotPings 7 лет назад 1
Это было именно то, что я искал @Lotpings !! Спасибо!! gsb005 7 лет назад 0
Не стесняйтесь голосовать за этот ответ ;-) LotPings 7 лет назад 0
Будет ли, но как? (Я новичок здесь) Я не вижу голосующих рядом с ним? :-( gsb005 7 лет назад 0
Вам понадобится еще 4 представителя [чтобы проголосовать] (https://superuser.com/help/privileges/vote-up) LotPings 7 лет назад 0

1 ответ на вопрос

0
Ƭᴇcʜιᴇ007

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

$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 
Большое спасибо Techie007. Это удивительно для меня это; ---- PowerShell не имеет возможности исключить папку и все, что находится под ней? кажется, что такая основная предпосылка. gsb005 7 лет назад 0
К сожалению, $ mysys = 'c: \ windows \ *' не работал, он все еще выглядит под ним. gsb005 7 лет назад 0
`" К сожалению, $ mysys = 'c: \ windows \ *' не сработало "` Просто делать это не собирается ничего исправлять, это просто лучший / правильный синтаксис для "всего, что начинается с" c: \ windows \\ `». :) Ƭᴇcʜιᴇ007 7 лет назад 0
Techie007, не могли бы вы пролить некоторый свет здесь, подскажите, пожалуйста, если каким-то образом использование $ env: SystemRoot, параметр в приведенном выше скрипте даст положительные результаты? gsb005 7 лет назад 0
Использование переменной окружения `$ env: SystemRoot` лучше использовать, если вы будете повторно использовать сценарий (на разных компьютерах), поскольку Windows может быть установлена ​​в месте, отличном от` c: \ windows`, следовательно, почему эта системная переменная существует. Сказав это, использование этой переменной вместо `c: \ windows` в рассматриваемом коде не будет иметь никакого значения. Ƭᴇcʜιᴇ007 7 лет назад 0
Techie007, для вас странно, что PowerShell, как вы объяснили, не имеет * простого способа * исключить целую папку и ее элементы? gsb005 7 лет назад 0
Нет, для меня это не странно, поскольку GCI возвращает массив объектов, а не простой текстовый список. Что странно для меня, так это то, что вы обнаруживаете ошибки «Отказано в доступе» во время этого процесса. :) Ƭᴇcʜιᴇ007 7 лет назад 0
Примечание: решение (я) по вопросу @LotPings, приведенное в его комментарии, все еще реализует действие ContinueSilently Error (по тем же причинам, что и здесь. :)) Ƭᴇcʜιᴇ007 7 лет назад 0
ошибки в доступе запрещены, и я могу жить с ними, как вы объяснили даже с переключателем SilientlyContinue. gsb005 7 лет назад 0
главная проблема в том, я не хочу, чтобы мой "поиск" входил в область папки Windows, я не хочу ничего из этой папки; следовательно, я хочу избежать этого, как чумы, если есть dll, который я хочу в будущем, только тогда я укажу свою энергию на эту папку. Я не хочу, чтобы мой рекурсивный поиск охватывал c: \ windows и все под ним. Во-первых, позже я хочу передать команду «move», чтобы переместить некоторые из этих txt-файлов в другой каталог, и хочу избежать «изменения» или риска «изменения» в папке systemroot. gsb005 7 лет назад 0
Таким образом, поиск в папке Windows на самом деле не важен, а в том, что вам не нужны результаты из папки Windows, даже если вам разрешено входить в папку, и файлы, соответствующие вашим критериям - правильно ? Ƭᴇcʜιᴇ007 7 лет назад 0
Точно, Techie007. Кстати, спасибо за все советы здесь до сих пор. gsb005 7 лет назад 0
Затем я бы посмотрел на использование Where-Object для фильтрации результатов, как это предлагается в вопросах и ответах, связанных с @LotPings: https://superuser.com/questions/1190355/powershell-get-childitem-include-exclude-simple-script -не работает правильно :) Ƭᴇcʜιᴇ007 7 лет назад 0
Отлично!! Спасибо, что остаетесь вокруг и отвечаете на все вопросы, хорошего дня, сэр. gsb005 7 лет назад 0