Un script Powershell pour trier les photos
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

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