Claire
4 years ago
2 changed files with 382 additions and 2 deletions
@ -1,3 +1,13 @@ |
|||||||
# tarotfilenamer |
# Tarot File Renamer |
||||||
|
|
||||||
A PowerShell script that takes a directory of scanned tarot cards and organizes them into directories. |
A PowerShell script that takes a directory of scanned tarot cards and organizes them into directories. |
||||||
|
|
||||||
|
Start with a directory of **at least** 22 trump cards, along with 14 cards each in four suits. If your deck has more than 22 trumps, just make sure the card names are included in the `$trumps` array. |
||||||
|
|
||||||
|
The script will prompt you to provide the suit names and court card names, if they vary from the standard. |
||||||
|
|
||||||
|
The script auto-rotates each image. If you don't need this, comment out |
||||||
|
|
||||||
|
```ps |
||||||
|
$img.RotateFlip("Rotate90FlipNone") |
||||||
|
``` |
@ -0,0 +1,370 @@ |
|||||||
|
# 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; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
Loading…
issues.context.reference_issue