Я пытаюсь запустить следующий код как скрипт PowerShell, но не могу заставить его работать. Во-первых, следующее работает с одним -Include
элементом, но я не могу заставить его работать с несколькими. Во-вторых, периметр, -Exclude
похоже, не работает. Я все еще получаю файлы изC:\WindowsиC:\Программные файлыкаталоги .
$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
Примечание: Цель этого скрипта — найти все сжатые файлы в системе. Я знаю, что это, вероятно, очень просто, но я просто не могу заставить это работать.
решение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
. Но он все равно может быть быстрее, даже если вам придется выполнять поиск четыре раза. Я не могу сказать наверняка. Возможно, стоит протестировать, если скорость важна для вас.)
решение2
Я согласен с dangph, что -exclude не работает так, как ожидалось.
При использовании -notmatch вы можете построить шаблон регулярного выражения с помощью or |
.
Это работает здесь с измененным $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
}