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 4.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. # Fonction pour récupérer une Array des extensions d'images et vidéos depuis un json
  2. function Get-ImageVideoExtensions {
  3. param (
  4. [string] $sourceUrl = "https://cdn.jsdelivr.net/gh/jshttp/mime-db@v1.52.0/db.json"
  5. )
  6. $jsonData = (Invoke-RestMethod $sourceUrl).PSObject.Properties
  7. $extensions = @()
  8. foreach ($item in $jsonData) {
  9. if ($item.Name -like "image*" -or $item.Name -like "video*") {
  10. $extensions += $item.Value.extensions
  11. }
  12. }
  13. $extensions = $extensions | Sort-Object -Unique
  14. return $extensions
  15. }
  16. # Fonction pour décompresser les archives
  17. function Decompress-ArchiveIfNeeded {
  18. param(
  19. [string]$ArchivePath,
  20. [string]$ExtractPath
  21. )
  22. if (Test-Path $ArchivePath -PathType Leaf) {
  23. $tempDir = Join-Path -Path $ExtractPath -ChildPath ([System.IO.Path]::GetRandomFileName())
  24. while (Test-Path $tempDir) {
  25. $tempDir = Join-Path -Path $ExtractPath -ChildPath ([System.IO.Path]::GetRandomFileName())
  26. }
  27. New-Item -Path $tempDir -ItemType Directory | Out-Null
  28. Expand-Archive -Path $ArchivePath -DestinationPath $tempDir
  29. return $tempDir
  30. }
  31. return $null
  32. }
  33. # Fonction pour obtenir la date de création d'une image/vidéo
  34. function Get-OriginalDate {
  35. param (
  36. $file
  37. )
  38. # Tentative de lecture des données EXIF
  39. $exif = Try { [System.Drawing.Image]::FromFile($file.FullName) } Catch { $null }
  40. if ($exif) {
  41. $exifDate = $exif.PropertyItems | Where-Object { $_.Id -eq 0x9003 } | ForEach-Object {
  42. [System.Text.Encoding]::ASCII.GetString($_.Value).TrimEnd([char]0)
  43. }
  44. if ($exifDate) {
  45. $date = [datetime]::ParseExact($exifDate, "yyyy:MM:dd HH:mm:ss", $null)
  46. } else {
  47. $date = $file.CreationTime
  48. }
  49. $exif.Dispose()
  50. } else {
  51. $date = $file.CreationTime
  52. }
  53. }
  54. # Demande des paramètres si non fournis
  55. if (-not $args[0] -or -not $args[1]) {
  56. $SourceDir = Read-Host "Entrez le chemin du dossier source"
  57. $DestinationDir = Read-Host "Entrez le chemin du dossier destination"
  58. } else {
  59. $SourceDir = $args[0]
  60. $DestinationDir = $args[1]
  61. }
  62. # Vérifie si le dossier source est une archive
  63. if ($SourceDir -match "\.zip$") {
  64. $SourceDir = Decompress-ArchiveIfNeeded -ArchivePath $SourceDir -ExtractPath $env:TEMP
  65. if (-not $SourceDir) {
  66. Write-Host "L'archive n'a pas pu être décompressée."
  67. return
  68. }
  69. }
  70. $validExtensions = Get-ImageVideoExtensions
  71. # Parcourt tous les fichiers récursivement dans le dossier source
  72. Get-ChildItem -Path $SourceDir -Recurse -File | ForEach-Object {
  73. $file = $_
  74. $extension = $file.Extension.ToLower().TrimStart('.')
  75. if ($extension -in $validExtensions) {
  76. # Tentative de lecture des données EXIF
  77. $exif = Try { [System.Drawing.Image]::FromFile($file.FullName) } Catch { $null }
  78. if ($exif) {
  79. $exifDate = $exif.PropertyItems | Where-Object { $_.Id -eq 0x9003 } | ForEach-Object {
  80. [System.Text.Encoding]::ASCII.GetString($_.Value).TrimEnd([char]0)
  81. }
  82. if ($exifDate) {
  83. $originalDate = [datetime]::ParseExact($exifDate, "yyyy:MM:dd HH:mm:ss", $null)
  84. } else {
  85. $originalDate = $file.CreationTime
  86. }
  87. $exif.Dispose()
  88. } else {
  89. $originalDate = $file.CreationTime
  90. }
  91. if (-Not $originalDate) {
  92. $targetFolder = Join-Path -Path $DestinationDir -ChildPath "Non daté"
  93. } else {
  94. # Créer le dossier de destination basé sur l'année et le mois
  95. $year = $originalDate.Year
  96. $monthNum = $originalDate.Month.ToString("00")
  97. $monthName = $originalDate.ToString("MMMM", [System.Globalization.CultureInfo]::GetCultureInfo("fr-FR"))
  98. $targetFolder = Join-Path -Path $DestinationDir -ChildPath "$year\$monthNum - $monthName"
  99. }
  100. if (-Not (Test-Path $targetFolder)) {
  101. New-Item -Path $targetFolder -ItemType Directory | Out-Null
  102. }
  103. # Copier le fichier dans le dossier de destination
  104. Copy-Item -Path $file.FullName -Destination $targetFolder
  105. } else {
  106. Write-Host "Fichier ignoré: $($file.FullName)"
  107. }
  108. }
  109. # Suppression du dossier temporaire si nécessaire
  110. if ($SourceDir -like "$env:TEMP\*") {
  111. Remove-Item -Path $SourceDir -Recurse -Force
  112. }