Un script Powershell pour trier les photos
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

ArrangePictures.ps1 3.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. # Demande à l'utilisateur de saisir les chemins source et destination
  2. $zipFilePath = Read-Host "Veuillez entrer le chemin de l'archive source"
  3. $destinationPath = Read-Host "Veuillez entrer le chemin du dossier destination"
  4. # Vérifier si le fichier ZIP existe
  5. if (-Not (Test-Path $zipFilePath)) {
  6. Write-Host "Le fichier spécifié n'existe pas : $zipFilePath"
  7. Pause
  8. exit
  9. }
  10. # Créer un dossier temporaire pour dézipper l'archive
  11. $tempFolder = Join-Path (Get-Item $zipFilePath).DirectoryName ((Get-Item $zipFilePath).BaseName + "_temp")
  12. # Dézipper l'archive
  13. Expand-Archive -Path $zipFilePath -DestinationPath $tempFolder
  14. # Extensions d'images et de vidéos
  15. $imageVideoExtensions = @("jpg", "jpeg", "mp4", "gif")
  16. # Fonction pour obtenir le MimeType d'un fichier
  17. function Get-MimeType {
  18. param ($filePath)
  19. $shell = New-Object -ComObject Shell.Application
  20. $folder = $shell.Namespace((Get-Item $filePath).DirectoryName)
  21. $item = $folder.ParseName((Get-Item $filePath).Name)
  22. $mimeType = $folder.GetDetailsOf($item, 2) # "Type" dans les détails EXIF
  23. return $mimeType
  24. }
  25. # Fonction pour obtenir la date de création d'une image/vidéo
  26. function Get-OriginalDate {
  27. param ($filePath)
  28. $shell = New-Object -ComObject Shell.Application
  29. $folder = $shell.Namespace((Get-Item $filePath).DirectoryName)
  30. $item = $folder.ParseName((Get-Item $filePath).Name)
  31. $dateTaken = $folder.GetDetailsOf($item, 12) # "Date Taken" dans les détails EXIF
  32. $dateTaken = [System.Text.RegularExpressions.Regex]::Replace($dateTaken, '[^\x20-\x7E]', '').Trim()
  33. $parsedDate = $null
  34. if ([datetime]::TryParse($dateTaken, [ref]$parsedDate)) {
  35. return $parsedDate
  36. } else {
  37. return $null
  38. }
  39. }
  40. # Parcourir récursivement le dossier temporaire
  41. Get-ChildItem -Path $tempFolder -Recurse -File | ForEach-Object {
  42. $file = $_
  43. $extension = $file.Extension.ToLower().TrimStart('.')
  44. # Vérifier le MimeType ou l'extension
  45. $mimeType = Get-MimeType -filePath $file.FullName
  46. $isImageOrVideo = $mimeType.StartsWith("image/") -or $mimeType.StartsWith("video/") -or $extension -in $imageVideoExtensions
  47. if ($isImageOrVideo) {
  48. # Obtenir la date de création originale
  49. $originalDate = Get-OriginalDate -filePath $file.FullName
  50. if (-Not $originalDate) {
  51. Write-Host "Avertissement : Pas de date de création trouvée pour le fichier $($file.FullName)"
  52. } else {
  53. # Créer le dossier de destination basé sur l'année et le mois
  54. $year = $originalDate.Year
  55. $monthNum = $originalDate.Month.ToString("00")
  56. $monthName = $originalDate.ToString("MMMM", [System.Globalization.CultureInfo]::GetCultureInfo("fr-FR"))
  57. $targetFolder = Join-Path -Path $destinationPath -ChildPath "$year\$monthNum - $monthName"
  58. if (-Not (Test-Path $targetFolder)) {
  59. New-Item -Path $targetFolder -ItemType Directory | Out-Null
  60. }
  61. # Copier le fichier dans le dossier de destination
  62. Copy-Item -Path $file.FullName -Destination $targetFolder
  63. }
  64. }
  65. }
  66. # Supprimer le dossier temporaire
  67. Remove-Item -Recurse -Force $tempFolder
  68. Write-Host "Dossier temporaire supprimé : $tempFolder"
  69. Pause