Blog/Windows/photo_rename_datetime.ps1

97 lines
4.5 KiB
PowerShell
Raw Permalink Normal View History

2023-12-16 17:20:09 +01:00
#Script créé par Nicolas Lang - Sous licence CC-BY-SA
#https://nicolaslang.fr
[System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms")
#Création de l'objet de selection de la boite de dialogue
$filepick = New-Object System.Windows.Forms.OpenFileDialog
#On précise qu'on peut choisir plusieurs fichiers
$filepick.Multiselect = $true
#On filtre uniquement sur les images
$filepick.Filter = "Images (*.BMP;*.JPG;*.GIF)|*.BMP;*.JPG;*.GIF"
#On définit un repertoire par défaut
$filepick.InitialDirectory = "C:\"
$filepick.Title = "Selectionnez une ou plusieurs photos"
#On affiche le Forms en enregistrant le bouton cliqué dans une variable
$filepickreturn = $filepick.ShowDialog()
#Un tableau récapitulatif
$array = New-Object System.Collections.ArrayList
#Utilisé à la fin pour calculer le temps pris
$start = Get-Date
if ($filepickreturn -eq "OK")
{
#Cette ligne renvoie la longueur de la string du nombre de fichier. Utilisé ensuite pour l'incrément. Ex : 3 fichiers, longueur du chiffre 3 : 1 caractère => incrémentera jusque 9 au maximum. 15 fichiers, longueur de 15 : 2 caractères => incrémentera jusque 99 au maximum, etc.
$filesize = $filepick.FileNames.Count.ToString().length
#récupère le repertoire en allant du début jusqu'au dernier "\"
$repertoire = $filepick.FileName.substring(0,$($filepick.FileName.lastindexof("\")))
#On crée l'objet Shell
$objShell = New-Object -ComObject Shell.Application
#On selectionne le répertoire
$objfolder = $objShell.NameSpace($repertoire)
#On filtre les objets pour ne prendre que ceux selectionnés par le Forms
$objectlist = $objfolder.Items() | Where-Object {$_.path -in $filepick.FileNames}
#Utilisé pour l'affichage de la progression
$a = 0
foreach ($file in $objectlist)
{
#On tente d'obtenir les détails de l'image. En cas d'erreur, on passe à la suivante
try
{
$picturedate = $objfolder.GetDetailsOf($file,12)
}
catch
{
Write-Error "Impossible de récuperer la date sur $($file.Path)"
continue
}
#On récupère l'objet afin de pouvoir avoir l'extension. En cas d'erreur, on passe à l'image suivante.
try
{
$item = Get-Item $($file.Path)
}
catch
{
Write-Error "Erreur sur $($file.Path)"
continue
}
$i = 0
$extension = $item.Extension
#L'incrément se fait sur ce format : (001) . Le nombre de 0 change selon le nombre de photos selectionnées
$increment = $("({0:D$filesize})" -f $i)
#On retire les caractères inadéquat pour la création d'un nom de fichier
$newfilename = (get-date -UFormat $picturedate).Replace("/","-").Replace(" ","-").Replace(":","-") + $extension
$a++
do
{
#On reconstitue le nom complet du fichier : Repertoire + nouveau nom
$fullfilename = Join-Path $repertoire $newfilename
#On regarde si le fichier existe déja...
$testpathreturn = (Test-Path $fullfilename)
#Et si oui, on ajoute 1 à l'incrément et que l'on ajoute au nom du fichier. On incrémente le nom du fichier jusqu'a ce que l'on tombe sur aucun fichier ne portant ce nom.
if ($testpathreturn -eq $true)
{
$i++
$increment = $("({0:D$filesize})" -f $i)
#Format : jj-mm-yyyy-HH-MM (increment).extension
$newfilename = (get-date -UFormat $picturedate).Replace("/","-").Replace(" ","-").Replace(":","-") + " " + $increment + $extension
}
#Une barre de progression, toujours utile pour savoir ou on en est
Write-Progress -Activity "Renommage des fichiers en cours" -CurrentOperation "$($file.Name) => $newfilename" -PercentComplete ($a / $objectlist.Count * 100)
}while($testpathreturn -eq $true)
#Les objets fichier obtenus par Shell.Application ont une méthode permettant de leur définir aisément un nouveau nom.
$file.Name = $newfilename
$array.Add([PSCUSTOMOBJECT]@{
"Nom_initial"= $file.Name
"Nouveau_nom" = $newfilename}) | Out-Null
}
}
#Fin du chrono
$end = Get-Date
#On calcule le temps passé
$temps = $end - $start
#On affiche un récap de toutes les modifications faites
$array | ft
#Ainsi que le temps passé et le nombre de fichiers!
write-host "$($objectlist.Count) photos en $([math]::round($temps.TotalSeconds,0)) secondes"