#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"