Powershell Get-ChildItem Include \ Exclude - простой скрипт не работает должным образом

1961
securityghost

Я пытаюсь запустить следующий код как скрипт powershell, но не могу заставить его работать. Во-первых, следующее работает с одним -Includeэлементом, но я не могу заставить его работать с несколькими. Во- -Excludeвторых, периметр не работает. Я все еще получаю файлы из каталогов C: \ Windows и C: \ Program Files .

$Include = "*.zip","*.rar","*.tar","*.7zip" $exclude = "C:\Windows","C:\Program Files" Get-ChildItem "C:\" -Include $Include -Exclude $Exclude -Recurse -Force -ErrorAction silentlycontinue | Select-Object -ExpandProperty FullName 

Примечание. Цель этого сценария - найти все сжатые файлы в системе. Я знаю, что это, вероятно, действительно просто, но я просто не могу заставить его работать.

3

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

2
LotPings

Я согласен с dangph, что -exclude не работает должным образом.
При использовании -notmatch вы можете создать шаблон регулярного выражения с помощью или |.
Это работает здесь с пересмотренным $ include:

$Include = @('*.zip','*.rar','*.tar','*.7zip') $exclude = [RegEx]'^C:\\Windows|^C:\\Program Files' Get-ChildItem "C:\" -Include $Include -Recurse -Force -EA 0|  Where FullName -notmatch $exclude| Select-Object -ExpandProperty FullName 

РЕДАКТИРОВАТЬ Поскольку исключенные папки относятся к первому уровню, гораздо быстрее их вообще не повторять, поэтому двухэтапный подход более эффективен:

$Include = @('*.zip','*.rar','*.tar','*.7zip') $exclude = [RegEx]'^C:\\Windows|^C:\\Program Files'  Get-ChildItem "C:\" -Directory | Where FullName -notmatch $exclude|ForEach { Get-ChildItem -Path $_.FullName -Include $Include -Recurse -Force -EA 0|  Select-Object -ExpandProperty FullName } 
Однажды я вынул `-Force` и` -EA 0`, это сработало. Не знаю почему? Благодарю. securityghost 7 лет назад 0
Извините за это, различия версий PowerShell. Оба поддерживаются в более высоких выпусках. `-EA 0` - это просто сокращение для` -ErrorAction silentlycontinue` LotPings 7 лет назад 0
1
dangph

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

$Include = "*.zip","*.rar","*.tar","*.7zip" Get-ChildItem "C:\" -Include $Include -Recurse -Force -ErrorAction silentlycontinue |  ? { $_.FullName -notmatch "^C:\\Windows" -and $_.FullName -notmatch "^C:\\Program" } | Select-Object -ExpandProperty FullName 

(Кстати, -Filterнамного, намного быстрее, чем -Include. Недостатком является то, что вы не можете дать ему массив шаблонов, как вы можете -Include. Но это все равно может быть быстрее, даже если вам пришлось искать четыре раза. Я не мог скажи наверняка. Возможно, стоит проверить, важна ли вам скорость.)

Похожие вопросы