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!
There’s no point in having a CSV for just a single column, just make it a simple text file and it’ll simplify the code a bit. So assuming you have a file called
names.txt
, here’s a one-liner that can do the trick:As long as the order in your text file matches the order shown by
dir
, you shouldn’t have any issues. Maybe do a dry run with a-WhatIf
to theren
first to see how the files are being renamed, before you do the actual rename. :)Also I had someone help with a similar task of duplicating a Word file that is renamed from a list of names found in a csv file. What would be the code when a txt file is used?
Import-csv ‘.\individuals.csv’ | foreach-object { $newname = ‘2’ + $_.name + '.docx’ Copy-item '.\_2023 Summary Page.docx' $newname }
deleted by creator
That will crash if there is more than one line in individuals.txt, because by the second iteration ‘.\_2023 Summary Page.docx’ has been renamed.
I see. Any suggestions on how to correct it?
Just use Copy-Item instead of Rename-Item if you want multiple identical files with different names
Actually they’re all different files.
Then the snippet won’t work because it only ever renames/copies the file
'_2023 Summary Page.docx'
. What are the actual names of the files you want to rename?Thanks but I’m getting a ‘Cannot create a file when that file already exists.’ error. I checked the path so I am certain it is correct.
That means there’s a duplicate entry, check the full error message for the file name. You can also use the
-Verbose
switch to see what’s going on.It manages to output one file titled ‘name; 0++’
Ah, I misplaced a quote in my code, I’ve update the post - try version.
So it sort of worked in that it outputed a bunch of files with the names but with blank icons and not the Adobe icons. Powershell also had an error for each list item that looked like the following:
Rename-Item : Cannot bind argument to parameter 'NewName' because it is an empty string. At line:1 char:86 + ... ads\individuals.txt"; $i=0; dir | % { ren $_ "$($names[$i])"; $i++ } + ~~~~~~~~~~~~~~~ + CategoryInfo : InvalidData: (:) [Rename-Item], ParameterBindingValidationException + FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAllowed,Microsoft.PowerShell.Commands.Rena meItemCommand
Maybe the command needs ‘.pdf’ somewhere?
Well yeah, you need the full name of the file. PowerShell will not automatically asumme the extension of a file.
Also that empty string error means there’s a blank line somewhere in your input list, so you’ll need to get rid of that.
Just figured it out! Added ‘.pdf’ in the second half of the command.
$names = cat "\path\to\names.txt"; $i=0; dir | % { ren $_ "$($names[$i]).pdf"; $i++ }
Thanks for all your help!