Estoy intentando ejecutar el siguiente código como un script de PowerShell, pero no consigo que funcione. Primero, lo siguiente funciona con un -Include
elemento, pero parece que no puedo hacerlo funcionar con varios. En segundo lugar, el -Exclude
perí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 -Exclude
parámetro nunca ha funcionado correctamente. Parece coincidir con la Name
propiedad, 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, -Filter
es 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
}