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

Était-ce utile?

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

scroll top