Saturday, 29 November 2014

Supporting my bulk photo rename with Powershell

As I wrote in my last post PowerShell is a very powerful scripting language that can do a lot of stuff in a Windows environment. I spent a bit of time hacking this script together to support my bulk photo rename. Briefly put the steps in the bulk photo rename were:
  • extract the photos from their existing folders by doing a search in the Photos folder
  • Segregate the photos into different subfolders depending on which camera they came from
  • Perform the bulk rename using the new name pattern YYYYMMDD-HHMMSS_cam_#$O (IrfanView)
  • Move everything back into their existing folders again.
The last step is where Powershell came in. Firstly the folder names were generally of the form YYYY_MM_DD and secondly the task of splitting up manually the 65,000 photos into numerous folders when often there might only be less than 10 images per folder was always going to be a slow and arduous task. I have nine years of digital photos with at least 1000 folders, probably more like 2000.

The piece of PowerShell script that has accomplished this is listed below. I didn’t need to write it in PowerShell; there are plenty of scripting language options in Windows. However I chose PowerShell because of its flexibility and functionality and because I need to learn more about it to use it in the course of my everyday work.
$photonames = Get-ChildItem -Path "D:\users\kahuk_000\Pictures\Photos"
foreach($filename in $photonames)
{
    if ($filename.Attributes -ne "Directory")
    {
        if ($filename.Length -ge 10)
        {
            $folderyear = $filename.Name.Substring(0,4)
            if ($folderyear -ge 1980)
            {
                if ($folderyear -le 2014)
                {
                    $foldermonth = $filename.Name.Substring(4,2)
                    $folderday = $filename.Name.Substring(6,2)
                    $foldername = $folderyear + "_" + $foldermonth + "_" + $folderday
                    $foldername
                    $folderpath = "D:\users\kahuk_000\Pictures\Photos\" + $foldername
                    if ((Test-Path $folderpath -pathtype container) -eq $true)
                    {
                        Move-Item $filename.FullName $folderpath
                    }
                     
                }
            }
        }
    }
}
So basically this script reads all the filenames in the Photos folder. It goes through each one in turn and checks to see it is a filename then it does a few checks to determine if the filename contains a valid year. With that completed it then extracts the parameters needed to make a valid directory name. It is then a simple matter of looking up the directory name and then moving the photo into that folder.

And that is what scripting is great for, automating day to day tasks and making our lives easier.