Powershell Get-ChildItem Include\Exclude: el script simple no funciona correctamente

Powershell Get-ChildItem Include\Exclude: el script simple no funciona correctamente

Estoy intentando ejecutar el siguiente código como un script de PowerShell, pero no consigo que funcione. Primero, lo siguiente funciona con un -Includeelemento, pero parece que no puedo hacerlo funcionar con varios. En segundo lugar, el -Excludeperímetro no parece funcionar. Todavía recibo archivos delC:\WindowsyC:\Archivos de programadirectorios.

$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

Nota: El propósito de este script es encontrar todos los archivos comprimidos en el sistema. Sé que esto probablemente sea muy simple, pero parece que no puedo hacerlo funcionar.

Respuesta1

El -Excludeparámetro nunca ha funcionado correctamente. Parece coincidir con la Namepropiedad, lo que normalmente no resulta muy útil. Probablemente sólo tengas que hacer el filtrado tú mismo:

$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

(Por cierto, -Filteres mucho, mucho más rápido que -Include. La desventaja es que no puedes darle una variedad de patrones como puedes hacerlo con -Include. Pero aun así puede ser más rápido incluso si tuvieras que buscar cuatro veces. No pude decirlo con seguridad. Podría valer la pena probarlo si la velocidad es importante para usted).

Respuesta2

Estoy de acuerdo con dangph en que -exclude no funciona como se esperaba.
Al usar -notmatch puedes crear un patrón de expresiones regulares con o |.
Esto funciona aquí con el $include revisado:

$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

EditarDado que las carpetas excluidas son de primer nivel, es mucho más rápido no iterarlas en absoluto, por lo que un enfoque de dos pasos es más eficiente:

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

información relacionada