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

Я пытаюсь запустить следующий код как скрипт powershell, но я не могу заставить его работать. 1-й, следующие работы с одним элементом -Include но я не могу заставить его работать с несколькими. 2-й, по- -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 

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

  • Возможно ли иметь переменные среды на пути рабочего каталога: PS1?
  • Linux: приглашение раскраски bash нарушит возврат каретки
  • Цветная строка PS1
  • 2 Solutions collect form web for “Powershell Get-ChildItem Include \ Exclude – простой скрипт не работает должным образом”

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

    EDit Поскольку исключенные папки являются первым уровнем, гораздо быстрее не переименовывать их, поэтому более эффективный двухступенчатый подход:

     $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 } 

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

    Давайте будем гением компьютера.