Post

Archiving Adobe Lightroom Back Ups with PowerShell

If you are an Adobe Lightroom user it is critical to have regular backups of your photo library catalogue. Luckily this is a simple task thanks to the fact that Lightroom has features built in to regularly taka a backup for you (which in effect means making a copy of your current catalogue file into a new location in the location you have specified in the user preferences of the application.

For information on how to configure the backup settings in Lightroom check out this Adobe link: https://helpx.adobe.com/lightroom/help/back-catalog.html

Lightroom unfortunately does nothing to clear out old backups and prior to Lightroom version 6 these backups were not even compressed, which together can mean the space required to store backups grows very quickly. It was always frustrating as the catalogue files can be compressed by a huge margin (80-90% in cases). Luckily newer versions of Lightroom now compress the backups into zip files which makes their size much less of an issue.

Anyway for those familiar with PowerShell I have a script that I use which after each backup to remove old backups, compress the new backups and move the backup to a new location (to a separate drive to guard against drive failure).

The script is called LR_Zip_Tuck as it zips the backups and tucks them away. There are two versions of the script. V1 is for Lightroom versions before V6/CC as it includes the additional compression step which is no required since Lightroom V6. This still wo9rks with Lightroom V6 but is slower , and so V2 of the Script is recommended.

The script first waits until the Lightroom application is no longer running before proceeding. This means that you can run this script on exit of Lightroom as it is still backing up (if you have it set to backup on exit) and it will wait until Lightroom has finished (I run it from a desktop shortcut when I still in Lightroom or it is backing up on exit).

1
2
3
4
5
6
7
8
9
10
11
## check if Lightroom is running, and if so just wait for it to close
$target = "lightroom"
 
$process = Get-Process | Where-Object {$_.ProcessName -eq $target}
 
if($process)
{
    Write-Output "Waiting for Lightroom to exit..."
    $process.WaitForExit()
    start-sleep -s 2
}

It then loops each folder in the backup location looking for catalogue backups that Lightroom has created since the last time the script was run. It then copies it to the off drive backup location and then deletes local the file.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
## loop each subfolder in backup location and process
foreach ($path in (Get-ChildItem -Path $LocalBkUpFolder -Directory))
{
    ## find zip file in this folder and rename
    $path | Get-ChildItem | where {$_.extension -eq ".zip"} | Select-Object -first 1 | % { $_.FullName} | Rename-Item -NewName {$path.Name + ".zip"}
 
    ## move file to parent folder (as dont need subfolders now)
    $SourceFilePath = $path.FullName + "\" + $path.Name + ".zip"
    Move-Item $SourceFilePath -Destination $LocalBkUpFolder
 
    ## copy zip to remote share location
    Write-Output "Tucking backup away on remote share"
    Copy-Item $NewFileName -Destination $RemoteBkUpFolder
 
    ## delete folder
    Remove-Item -Recurse -Force $path.FullName
}

It then does some house keeping ensuring that only the configured number of old backups exist in the local and remote locations (ensuring that the oldest are deleted first). This prevents the backups building up over time.

1
2
3
4
5
## cleanup zip files (local)
Remove-MostFiles $LocalBkUpFolder *.zip 8
 
## cleanup zip files (remote)
Remove-MostFiles $RemoteBkUpFolder *.zip 20

That’s about it. The scripts are available on my GitHub repo here (as LR_ZipTuck_V1.ps1 and LR_ZipTuck_V2.ps1).

This post is licensed under CC BY 4.0 by the author.