# If you haven't already done so you will need to run this to be able to execute PowerShell scripts # You will need to run PowerShell as administrator to run this script set-executionpolicy remotesigned <# .SYNOPSIS Renames pictures. .DESCRIPTION The Rename-Pictures cmdlet to rename pictures to a format where the file creation time is first in the name in this format: . The idea is that .PARAMETER Path Specifies the path to the folder where image files are located. Default is current location (Get-Location). .EXAMPLE PS C:\> Rename-Pictures Description: Renames all the pictures in folder you are in. .EXAMPLE PS C:\> Rename-Pictures -Path C:\Folder\Pics\ Description: Renames all the pictures in the given folder path. .NOTES Author: Magnus Ringkjøb E-mail: magnus.ringkjob@gmail.com Image Dimensions Added By David Kittell - Kittell.net #> Param( [string]$Path ) if ([string]::IsNullOrWhiteSpace($Path)) { $Path = (Get-Location) } $BackupFileName = '_backupdata.csv' $ErrorFileName = '_errors.csv' [reflection.assembly]::LoadFile("C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Drawing.dll") $Script:ErrorLogMsg = $Null $Script:CorrectPath = $Null $Path $ImgsFound = (dir $Path -Include ('*.jpeg', '*.png', '*.gif', '*.jpg', '*.bmp', '*.png') -Recurse | Select-Object -Property FullName, Name, BaseName, Extension) # If any file was found # Array that takes in the old- and the new filename. This is used for saving a backup to .csv $BackupData = @() # Loops through the images found foreach ($Img in $ImgsFound) { # Gets image data $ImgData = New-Object System.Drawing.Bitmap($Img.FullName) $ImgDimensions = $ImgData.Width.ToString() + $("x") + $ImgData.Height.ToString() try { # Gets 'Date Taken' in bytes [byte[]]$ImgBytes = $ImgData.GetPropertyItem(36867).Value } catch [System.Exception], [System.IO.IOException] { [string]$ErrorMessage = ( (Get-Date).ToString('yyyyMMdd HH:mm:ss') + "`tERROR`tDid not change name for " + $Img.Name + ". Reason: " + $Error ) $Script:ErrorLogMsg += $ErrorMessage + "`r`n" Write-Host -ForegroundColor Red -Object $ErrorMessage # Clears any error messages $Error.Clear() # No reason to continue. Move on to the next file continue } # Gets the date and time from bytes [string]$dateString = [System.Text.Encoding]::ASCII.GetString($ImgBytes) # Formats the date to the desired format [string]$dateTaken = [datetime]::ParseExact($dateString, "yyyy:MM:dd HH:mm:ss`0", $Null).ToString('yyyy-MM-dd_HH.mm.ss.ms') # The new file name for the image # [string]$NewFileName = $dateTaken + '-' + $Img.Name [string]$NewFileName = $dateTaken + "_" + $ImgDimensions + [System.IO.Path]::GetExtension($Img.Name) $ImgData.Dispose() try { Rename-Item -NewName $NewFileName -Path $Img.FullName -ErrorAction Stop Write-Host -Object ("Renamed " + $Img.Name + " to " + $NewFileName) } catch { [string]$ErrorMessage = ( (Get-Date).ToString('yyyyMMdd HH:mm:ss') + "`tERROR`tDid not change name for " + $Img.Name + ". Reason: " + $Error ) $Script:ErrorLogMsg += $ErrorMessage + "`r`n" Write-Host -ForegroundColor Red -Object $ErrorMessage # Clears any previous error messages $Error.Clear() # No reason to continue. Move on to the next file continue } # Collect data to be added to the backup file $BUData = New-Object -TypeName System.Object $BUData | Add-Member -MemberType NoteProperty -Name "OldName" -Value $Img.Name $BUData | Add-Member -MemberType NoteProperty -Name "NewName" -Value $NewFileName # Add data to backup collection $BackupData += $BUData try { $BackupData | Export-Csv -NoTypeInformation -Path "$Path\\$BackupFileName" } catch [System.Exception] { [string]$ErrorMessage = "((Get-Date).ToString('yyyyMMdd HH:mm:ss'))`tERROR`tCould not create $Path $BackupFileName Reason: " + $Error $Script:ErrorLogMsg += $ErrorMessage + "`r`n" # Clears any error messages $Error.Clear() } } # If there was a problem during the run: # Print to file, and let user know if ($Script:ErrorLogMsg -ne $Null) { $ErrorLogMsg | Export-Csv -NoTypeInformation -Path "$Path\\$ErrorFileName" Write-Host -ForegroundColor Red -Object ( "Errors were found. Please check " + $Path + "_errors.log" ) }
GitHub: https://gist.github.com/dkittell/746e69967a7f4d0f0c52
Reference: https://gallery.technet.microsoft.com/Rename-picture-files-with-97738191 (Magnus Ringkjøb)
Last Updated on December 17, 2023