Recherche d'image intelligente via Powershell
-
23-10-2019 - |
Question
Je suis intéressé par la recherche de fichiers par propriétés personnalisées. Par exemple, je veux trouver toutes les images JPEG avec certaines dimensions. ressemble quelque chose comme
Get-ChildItem -Path C:\ -Filter *.jpg -Recursive | where-object { $_.Dimension -eq '1024x768' }
Je soupçonne qu'il est sur l'utilisation de System.Drawing. Comment ça peut se faire? Merci à l'avance
La solution
C'est en fait assez facile à faire et votre intuition au sujet System.Drawing a eu raison de fait:
Add-Type -Assembly System.Drawing
$input | ForEach-Object { [Drawing.Image]::FromFile($_) }
Enregistrer que quelque part de Get-Image.ps1
dans votre chemin et vous pouvez l'utiliser.
Une autre option serait d'ajouter ce qui suit à votre $profile
:
Add-Type -Assembly System.Drawing
function Get-Image {
$input | ForEach-Object { [Drawing.Image]::FromFile($_) }
}
qui fonctionne à peu près la même chose. Bien sûr, ajouter des choses de fantaisie, comme la documentation ou si comme bon vous semble.
Vous pouvez alors utiliser comme ceci:
gci -inc *.jpg -rec | Get-Image | ? { $_.Width -eq 1024 -and $_.Height -eq 768 }
Notez que vous devez disposer les objets créés de cette façon après leur utilisation.
Bien sûr, vous pouvez ajouter une propriété Dimension
personnalisée de sorte que vous pouvez filtrer pour cela:
function Get-Image {
$input |
ForEach-Object { [Drawing.Image]::FromFile($_) } |
ForEach-Object {
$_ | Add-Member -PassThru NoteProperty Dimension ('{0}x{1}' -f $_.Width,$_.Height)
}
}
Autres conseils
Voici une autre mise en oeuvre comme (presque) en une ligne:
Add-Type -Assembly System.Drawing
Get-ChildItem -Path C:\ -Filter *.jpg -Recursive | ForEach-Object { [System.Drawing.Image]::FromFile($_.FullName) } | Where-Object { $_.Width -eq 1024 -and $_.Height -eq 768 }
Si vous allez avoir besoin d'exécuter cette commande plus d'une fois, je recommanderais