4

Я пытаюсь запустить следующий код как скрипт 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

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

2 ответа2

2

Я согласен с 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
}
1

Параметр -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 . Но это все еще может быть быстрее, даже если вам пришлось искать четыре раза. Я не могу сказать наверняка. Возможно, стоит попробовать, если скорость важна для вас.)

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