# tarot folder $tdir = $env:OneDrive + "\Projects\Tarot\Scans" # empty array to hold menu options for user interaction $menuOpts = @{}; # retrieve list of decks (folders) in $tdir $decks = Get-ChildItem -path $tdir -Directory Write-Host = "==================== Scanned Decks ====================" # for each deck, create a new menu item for ($d = 0; $d -lt $decks.Count; $d++) { Write-Host "[$d] $($decks[$d].Name)" $menuOpts.Add($d, $decks[$d]) } # ask user which directory to use [int]$selOpt = Read-Host "Select a deck directory" $theOpt = $menuOpts.Item($selOpt) Write-Host "" # if directory contains no files, check for directories $files = Get-ChildItem -Path $theOpt.FullName -File $dirs = Get-ChildItem -Path $theOpt.FullName -Directory if ($null -eq $files -and $null -eq $dirs) { # nothing useful found, die Write-Host "The selected deck directory has no files or folders. Try again." end; } else { # initialize string arrays $trumps = @( "The Fool", "The Magician", "The High Priestess", "The Empress", "The Emperor", "The Hierophant", "The Lovers", "The Chariot", "Strength", "The Hermit", "The Wheel of Fortune", "Justice", "The Hanged Man", "Death", "Temperance", "The Devil", "The Tower", "The Star", "The Moon", "The Sun", "Judgememt", "The World" ) $trumps = @( "The Fool", "The Magician", "The High Priestess", "The Empress", "The Emperor", "The Hierophant", "The Lovers", "The Chariot", "Strength", "The Hermit", "The Wheel of Fortune", "Justice", "The Hanged Man", "Death", "Temperance", "The Devil", "The Tower", "The Star", "The Moon", "The Sun", "Judgememt", "The World", "The Well", "The Artist" ) $suits = @( "Cups", "Pentacles", "Swords", "Wands" ) $numbers = @( "Ace", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten" ) $courts = @( "Page", "Knight", "Queen", "King" ) $trumpcount = $trumps.Count $trumpend = $trumpcount - 1 $cardcount = $trumps.Count + 56 $npath = $theOpt.FullName if ($null -eq $files -and $null -ne $dirs) { # here be directories Write-Host "The selected deck directory contains folders." # make sure there's exactly five directories # major arcana plus four suits if ($dirs.Count -ne 5) { Write-Host "Directory must have exactly five directories. Fix and try again." } else { # we have five directories # use existing directory name # if directory contains 22 cards, it's 00 # if directory contains 14 cards, it's 01..04 # everything else is ignored $suitindex = 1 foreach($dir in $dirs) { $numfiles = ($dir | Get-ChildItem | Measure-Object).Count $dirname = $dir.Name if ($numfiles -eq $trumpcount) { # major arcana $newdir = $dir.Parent.FullName + "\00 - $dirname" # get list of images $cards = $dir | Get-ChildItem # for each of 22 images, go through the list of card names foreach($t in 0..$trumpend) { # get the file $file = $cards[$t] # set new filename e.g. 00.00 - The Fool $base = $t.ToString().PadLeft(2,'0') $card = $trumps[$t] $new = "00" + "." + $base + " - " + $card + ".jpg" $newname = $dir.FullName + "\" + $new if ($file.Name -eq $new) { # this file has already been processed and named. continue } else { # rename the image to the standard format Rename-Item $file.FullName -NewName $newname } } # rename directory Rename-Item $dir.FullName -NewName $newdir } elseif ($numfiles -eq 14) { # suits # suit name is folder name $suitname = $dir.Name # get the number, e.g. 01 $suitnum = $suitindex.ToString().PadLeft(2,"0") # set the new folder name $newdir = $dir.Parent.FullName + "\$suitnum - $suitname" # get the cards $cards = $dir | Get-ChildItem # loop through cards range foreach($i in 0..13) { # get the file $file = $cards[$i] $card = $fullsuit[$i] + " of " + $suitname # set new filename e.g. 00.00 - The Fool $base = ($i + 1).ToString().PadLeft(2,'0') $new = $suit + "." + $base + " - " + $card + ".jpg" $newname = $dir.FullName + "\" + $new if ($file.Name -eq $new) { # this file has already been processed and named. continue } else { # save the changes Rename-Item $file.FullName -NewName $newname } } # rename directory Rename-Item $dir.FullName -NewName $newdir # add one to the suit index $suitindex++ } else { Write-Host "Directory $($dir.Name) must have exactly 14 or 22 cards. Fix and try again." break; } } } } elseif ($null -ne $files) { # set up variables $suitsin = Read-Host "Enter a comma-separated list of four suit names. List will be processed in order. Default is Cups,Pentacles,Swords,Wands" $courtsin = Read-Host "Enter a comma-separated list of four court names. List will be processed in order. Default is Page,Knight,Queen,King" if ($suitsin -ne "") { $suits = $suitsin.Split(",").Trim() } if ($courtsin -ne '') { $courts = $courtsin.Split(",").Trim() } $fullsuit = $numbers + $courts # here be files Write-Host "The selected deck directory contains files." # get file types $exts = $files.Extension | group if ($exts.Count -ne $cardcount.ToString()) { #-or ($exts | % { $_.Count } ).Contains(78)) { Write-Host "Directory must have exactly 78 cards. Fix and try again." break; } elseif ($exts.Length -ne 1) { Write-Host "More than one file type found. All files must be the same type." break; } elseif ((".JPG,.PNG").Contains($exts.Name)) { Write-Host "$cardcount images identified." Write-Host "The first $trumpcount cards must be the trumps in order, Fool first." # Create folders $newpath = $npath + "\00 - Major Arcana" New-Item -Path $newpath -ItemType Directory # load .NET image assembly [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") # rename first 22 cards foreach ($t in 0..$trumpend) { # get the file $file = $files[$t] # set new filename e.g. 00.00 - The Fool $base = $t.ToString().PadLeft(2,'0') $card = $trumps[$t] $new = "00" + "." + $base + " - " + $card + ".jpg" if ($file.Name -eq $new) { # this file has already been processed and named. continue } else { # create an image from the file $img = [System.Drawing.Image]::FromFile($file.FullName) # if the image name starts with PD_ it's new, so rotate if ($file.Name.StartsWith("PD_")) { # rotate the image 90 degrees $img.RotateFlip("Rotate90FlipNone") } $newname = $newpath + "\" + $new # save the changes $img.Save($newname,"jpeg") #$file.Delete() } } Write-Host "" if ($suits.Length -eq 4) { # exactly four suits, proceed foreach ($s in 0..3) { # filename and folder base is 01,02,03,04 $suiti = $s + 1 $suit = $suiti.ToString().PadLeft(2,"0") $suitname = $suits[$s] $spath = $theOpt.FullName + "\$suit - $suitname" New-Item -Path $spath -ItemType Directory # start at index after last trump ($trumpcount) # add 14 x $s to 22 for start index # add 13 to above for end index $start = $trumpcount + (14 * $s) $end = $start + 13 # pull out the files to be renamed $tempfiles = $files[$start..$end] # loop through identified range foreach($i in 0..13) { # get the file $file = $tempfiles[$i] $card = $fullsuit[$i] + " of " + $suitname # set new filename e.g. 00.00 - The Fool $base = ($i + 1).ToString().PadLeft(2,'0') $new = $suit + "." + $base + " - " + $card + $exts[0].Name if ($file.Name -eq $new) { # this file has already been processed and named. continue } else { # create an image from the file $img = [System.Drawing.Image]::FromFile($file.FullName) # if the image name starts with PD_ it's new, so rotate if ($file.Name.StartsWith("PD_")) { # rotate the image 90 degrees $img.RotateFlip("Rotate90FlipNone") } $newname = $spath + "\" + $new # save the changes $img.Save($newname,"jpeg") #$file.Delete() } } } } else { # four suits required Write-Host "Please enter exactly four suits, separated with commas." Write-Host "For example: Cups,Pentacles,Swords,Wands" break; } } } }