diff --git a/Windows/photo_rename_datetime.ps1 b/Windows/photo_rename_datetime.ps1 new file mode 100644 index 0000000..49fbf5a --- /dev/null +++ b/Windows/photo_rename_datetime.ps1 @@ -0,0 +1,97 @@ +#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" \ No newline at end of file