Renommer en masses des images avec powershell

Renommer en masses des images avec powershell

Dans mon travail sur l’ia, j’ai besoin de générer plusieurs poses depuis des images sources. Dans cette optique, j’ai besoin de décrire les images mais comme j’en ai des centaines je passe par une api de DeepBooru via StableDiffusion (voir mon article sur A1111). Une fois ce travail effectué je me retrouve avec d’un coté les images sources et de l’autre une liste de fichier contenant la descritpion de chaque images.

Je passe donc un petit script PowerShell pour extraire les données des fichiers texte afin d’avoir un seul fichier noms.txt avec la liste de mes descriptions :


Get-ChildItem "D:\Textes" -File | 
    Sort-Object Name | 
    Select-Object -First 9 | 
    ForEach-Object { Get-Content $_.FullName } | 
    Out-File "D:\Images\noms.txt"
    1. Get-ChildItem "D:\Textes" -File :
      • Get-ChildItem est une commande PowerShell qui récupère les éléments dans un répertoire.
      • Le chemin "D:\Textes" spécifie le répertoire à examiner.
      • L’option -File limite les résultats aux fichiers seulement (pas les dossiers).
      • Cette commande liste tous les fichiers présents dans le répertoire "D:\Textes".
    1. | Sort-Object Name :

      • Le | (pipe) prend la sortie de la commande précédente et l’envoie à la commande suivante.
      • Sort-Object Name trie les fichiers récupérés par leur nom de manière croissante. Cette étape est utilisée pour organiser les fichiers avant de passer à l’étape suivante.
    2. | Select-Object -First 9 :

      • Select-Object -First 9 prend uniquement les 9 premiers fichiers de la liste triée. Cela permet de limiter le nombre de fichiers à 9, même s’il y en a plus dans le répertoire.
      • Si, par exemple, il y a 15 fichiers dans "D:\Textes", cette commande prendra les 9 premiers fichiers après le tri. Ici c’est un exemple mais on peut mettre la valeur que l’on veux. J’ai mis ça en plus car sinon ça boucle à l’infini.
    3. | ForEach-Object { Get-Content $_.FullName } :

      • ForEach-Object applique une action à chaque objet dans la liste fournie par la commande précédente (ici, chaque fichier).
      • Get-Content $_.FullName lit le contenu de chaque fichier dont le chemin complet est spécifié par $_. $_ représente l’élément actuel dans la boucle.
      • Cette étape permet de lire le contenu des 9 premiers fichiers sélectionnés.
    4. | Out-File "D:\Images\noms.txt" :

      • Out-File écrit la sortie dans un fichier spécifié.
      • Ici, le contenu des fichiers est écrit dans le fichier "D:\Images\noms.txt".
      • Tous les contenus des fichiers sont ajoutés dans ce fichier texte. Si un fichier texte "noms.txt" existe déjà, il sera écrasé. Si ce fichier n’existe pas, il sera créé.

Ensuite je lance un second script pour associer chaque ligne de mon fichier nom à l’image et renommer


# Définition du dossier des images et du fichier contenant les noms
$chemin = "D:\ID\Images"
$fichierNoms = "D:\ID\noms.txt"

# Récupère les fichiers images triés par nom
$images = Get-ChildItem -Path $chemin -File | Sort-Object Name

# Récupère les noms à partir du fichier texte
$noms = Get-Content -Path $fichierNoms

# Vérifie si le nombre de fichiers et de noms correspond
if ($images.Count -ne $noms.Count) {
    Write-Host "Erreur : $($images.Count) images trouvées, mais $($noms.Count) noms fournis."
    exit
}

# Boucle pour renommer les fichiers
for ($i = 0; $i -lt $images.Count; $i++) {
    $ancienNom = $images[$i].FullName
    $nomNettoye = $noms[$i] -replace '[\/:*?"<>|]', ''  # Supprime les caractères interdits
    $nouveauNom = Join-Path $chemin ($nomNettoye + $images[$i].Extension)

    # Vérifie si le fichier existe déjà
    if (Test-Path $nouveauNom) {
        Write-Host "Fichier existant, ignoré : $nouveauNom"
        continue
    }

    # Renommage sécurisé
    try {
        Rename-Item -Path $ancienNom -NewName $nouveauNom -ErrorAction Stop
        Write-Host "Renommé : $ancienNom -> $nouveauNom"
    } catch {
        Write-Host "Erreur lors du renommage : $_"
    }
}

Write-Host "Renommage terminé !"

Avant

Après

  • Pour gagner du temps, je crée un fichier script.ps1 contenant le code PowerShell nécessaire au renommage des fichiers.
  • Ensuite, je crée un raccourci sur mon bureau avec le chemin suivant : powershell.exe -ExecutionPolicy Bypass -File "D:\ID\renommage.ps1"
  • Je lui donne un nom explicite, comme « Renommage Auto », afin d’obtenir un programme de renommage automatique basé sur le fichier noms.txt créé précédemment.

Ainsi, un simple double-clic sur le raccourci suffit pour exécuter le script sans avoir à ouvrir PowerShell manuellement. 🚀

Finalement, mes images sont nommées selon leurs descriptions, ce qui est très pratique une fois importées dans A1111.