Bonjour
Je tombe parfois, ou parfois je l’assemble, sur des commandes ou des bouts de code pratique, je compte les stocker dans ce sujet au fil du temps. Cela restera du script a taille lisible donc pas des plus complexe normalement.
Le premier est déjà relativement gros, un script powershell pour trier des photos par date.
On peut utiliser la date de prise de vue, la date de modification ou la date de création du fichier (dans mon cas les dates de création et modification étaient hs car image récuperer avec logiciel de récuperation mais la date de prise de vue était ok)
On peut imaginer des modifications de ce code comme ajouter du code pour que la recherche soit recursive (ou filtrer par type) sur le Get-ChildItem mais faudra modifier le repertoire de sortie pour les mettre ailleurs, ou ajouter aussi un renommage des fichiers au passage.
Pour utiliser le code le plus simple est d’ouvrir powershell ISE sur windows
Il faut faire des modifications pour que le trie se fasse:
- mettre le bon nom de répertoire/dossier contenant les photos et lancer le script
- theoriquement cela affichera les 3 dates des fichiers, il faudra alors modifier la ligne $ladate avec le bon nom de variable et on relance
- si la sortie est bonne retirer les <# et #> pour que la creation et deplacement des fichiers se fassent à la prochaine execution, le new item va creer les repertoires et le move item déplacer dedans le fichier
#Fonction Get-DateTaken trouvée sur https://stackoverflow.com pour extraire la date de prise de vue: copiée directement
function Get-DateTaken {
[OutputType([datetime])]
param (
[Parameter(Mandatory = $true)]
[System.IO.FileInfo]
$file
)
# $DateFormat = 'dd.MM.yyyy HH:mm'
$DateTakenWinApi = 12
$DateCreatedWinApi = 4
if ($null -eq $Shell) {
$Shell = New-Object -ComObject shell.application
}
$dir = $Shell.Namespace($_.DirectoryName)
$DateTakenString = $dir.GetDetailsOf($dir.ParseName($_.Name), $DateTakenWinApi)
if ($DateTakenString -eq '') {
$DateTakenString = $dir.GetDetailsOf($dir.ParseName($_.Name), $DateCreatedWinApi)
}
# sanitze string
$DateTakenString = $DateTakenString -replace '[^0-9\.\:\ \/]', ''
# parse to DateTime
$DateTaken = Get-Date $DateTakenString # -Format $DateFormat
$DateTaken
}
#Le dossier source, à modifier correctement!
$dossier = "S:\Photos\fait_avirer\SonyHx20"
Get-ChildItem -LiteralPath $dossier -File -Force | ForEach-Object {
$dateprisedevue = Get-DateTaken($_)
$datemodif = $($_.LastWriteTime)
$datecreation = $($_.CreationTime)
# ladate c'est pour choisir l'un des 3 resultats avec ce qui est le plus efficace, il faut donc modifier la ligne suivante si necessaire
$ladate = $dateprisedevue
# Dans la ligne suivante on peut choisir ce que l'on veut comme repertoire/rangement ici yyyy_MM c'est year_month
# utilisable année = yyyy, mois = MM, jour = dd, heure = hh, minute = mm et même seconde avec ss yyyy_MM_dd_hh:mm donnrait 2024_07_04_12:03
#ici les images seront mises par repertoire année_mois
$dossier_cible = "$($_.DirectoryName)\$($ladate.ToString("yyyy_MM"))"
Write-Host "$_ prise le $dateprisedevue et modifiée en dernier le $datemodif fichier date creation $datecreation et finalement le choix actuel donnera une copie dans le dossier $dossier_cible"
# Write-Host "Nom avant $_ et nom possible $nom_cible "
#partie active a débloquer quand la sortie est bonne retirant les <# et #>
<#
if (!(Test-Path -LiteralPath $dossier_cible -PathType Container))
{
New-Item -Path $dossier_cible -ItemType Directory
}
$_ | Move-Item -Destination $dossier_cible -Force
#>
}