I had to work with some files where the interesting
number in the filename is not at the start, but after a keyword. So, if I
wanted to sort the files in the folder by the interesting number, I’d need to
rename the files to put the number at the start. Might seem like a pointless endeavour
but I have my reasons.
In the image below is a quick and simple example of how
the tool works. I’m interested in the number after CJ, so the keyword to split
on is CJ (not a word but you get it), and there are 2 digits we’re interested in.
After renaming, I can sort the files in the folder using the special number.
Image: Example of
FileNameSorter.ps1
The Script
I named it FileNameSorter.ps1
but you can call it anything you like. Then I ran as .\FileNameSorter.ps1.
Function
Wr{
If(!$Args[0]){Write-Host}
elseif(!$Args[1]){Write-Host $Args[0]
-NoNewLine}
else{Write-Host $Args[0] -NoNewLine
-ForegroundColor $Args[1]}
}
Wr
"Put Number in a Filename in front of the Filename" CYAN;Wr
Wr
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" CYAN;Wr
[System.Object]$Pwd
= Pwd
[String]$Current
= $Pwd.path
Wr
"Current Folder: " CYAN; Wr $Current WHITE;Wr
Wr
"Target Folder (or press ENTER to use current): " YELLOW
[String]$Target
= Read-Host
If(!$Target){$Target
= $Current}
elseif(!(Test-Path
$Target)){Wr "$Target is not a valid path!" RED;EXIT}
[System.Array]$Files
= (Get-ChildItem -Path $Target).Name
Wr
"Files in target:" CYAN;Wr
$Files
| Foreach{ Wr $_ WHITE;Wr }
Wr
"Keyword to Split on: " YELLOW
[String]$KeyWord
= Read-Host
Wr
"How many digits in the number: " YELLOW
[Int16]$Digits
= Read-Host
Function
FNS-Rename-Files{
Param([Switch]$Rename)
$Files | Foreach{
[System.Array]$S = ($_ -Split $KeyWord)
If($S.count -gt 1){
$NosAfterKeyword = ($S[1] -replace
'\D+(\d+)','$1')
If($NosAfterKeyword.length -ge $Digits){
$Nos =
$NosAfterKeyword.Substring(0,$Digits)
If(!$_.StartsWith($Nos) -and
[Bool]($Nos -as [double])){
If($Rename){Rename-Item ($Target +
"\" + $_) ($Nos + "_" + $_)}
$_ = ($Nos + "_" + $_)
}
}
}
Wr $_ WHITE;Wr
}
}
Wr
"Will rename files to:" CYAN;Wr
FNS-Rename-Files
Wr
"Okay to proceed (Y/N)? " YELLOW
[String]$YesOrNo
= Read-Host
If($YesOrNo
-ne "Y"){EXIT}
Wr
"Files renamed to:" CYAN;Wr
FNS-Rename-Files
-Rename
Comments
Post a Comment