Un script Powershell pour trier les photos
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

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. }