Note: I’m a beginner to Powershell and a bit more familiar with Bash (though still a beginner for that too).
*I have multiple PDF files and I want to rename each file based on a list of names found in an Excel/CSV (could be a text file if easier) file.
*The list begins at the A2 cell and the A1 cell has the header ‘name’.
*The files are in sequential order and match the order of the list of names.
Thanks for your help!
If the CSV file contains both the current names and the new names, this should work if you use the first line for column labels (I’m using OldName and NewName in this example):
Import-CSV $pathToCSV | ForEach-Object { Rename-Item $_.OldName $_.NewName }
If you just have a list of new names as a text file where the first line of the file is the new name for the first file (by name, sorted alphabetically), this should work:
$files = Get-ChildItem -File *.pdf | Sort-Object -Property Name #I think the output of Get-ChildItem is already sorted by name, but I'm not sure $newNames = Get-Content $pathToTXT if ($files.Count -ne $newNames.Count) { Write-Error "The number of PDF files to be renamed does not match the number of new names" exit } 0..($files.Count - 1) | ForEach-Object { Rename-Item $files[$_] $newNames[$_] }
Thanks but PS closes so I assume it ran into an error. I’m not sure why because there is the same number of files and list items. I doublechecked to make sure.
I have no idea why this wouldn’t work on your machine - I’ve tested it on mine and it works fine. So maybe you have overlooked some small things:
-
If there are any other PDFs in the directory that you don’t want to rename, then the list of files is longer than the list of names.
-
If the PS window closes completely, you might have typed it into the terminal instead of running it as a script - then the problem might just be that you closed the if block too early, so PS immediately executes the
exit
command. -
If your list of new names contains a column label like in a one-column CSV, then it has one more line than there are files.
-