this post was submitted on 25 Mar 2024
11 points (100.0% liked)

Powershell

1020 readers
1 users here now

PowerShell (POSH) is a a task automation command-line shell and scripting language created by Microsoft. It became part of the FOSS community in 2016 and is now available across Windows, Linux, and macOS

Resources:


Rules:

Self-promotion rules:


founded 1 year ago
MODERATORS
 

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!

you are viewing a single comment's thread
view the rest of the comments
[–] [email protected] 3 points 7 months ago* (last edited 7 months ago) (18 children)

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[$_] }

[–] [email protected] 1 points 7 months ago (15 children)

Perhaps my directions were unclear. The Excel/CSV file has the new names and I want to use them to replace the default names for the PDF files.

[–] [email protected] 3 points 7 months ago* (last edited 7 months ago) (14 children)

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:

$names = cat "\path\to\names.txt"; $i=0; dir | % { ren $_ "$($names[$i])"; $i++ }

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 the ren first to see how the files are being renamed, before you do the actual rename. :)

[–] [email protected] 1 points 7 months ago (1 children)

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
}
load more comments (12 replies)
load more comments (12 replies)
load more comments (14 replies)