Ralph Shillington
Ralph Shillington

Reputation: 21108

How to loop through files and rename using PowerShell?

I would like to rename all the jpg files in a folder to uniform convention like Picture00000001.jpg where 00000001 is a counter.

It would be a walk in the park in C# but I would think this is the kind of bread and butter stuff that PowerShell was made for.

I'm guessing something like

$files = ls *.jpg
$i=0
foreach($f in $files) { Rename-Item $f -NewName "Picture"+($i++)+".jpg" }

But before I hit the gas on this I would like to 1) format the counter, and 2) have some sense that this is in fact even a good idea.

If this sounds more like OCD than a good idea please speak up.

Upvotes: 21

Views: 34660

Answers (2)

Brent
Brent

Reputation: 118

Try this to get the FilenameWithOutExtension

$f.DirectoryName + "\" + $f.BaseName

Upvotes: 2

Keith Hill
Keith Hill

Reputation: 202072

You can do this fairly simply in PowerShell:

ls *.jpg | Foreach -Begin {$i=1} `
   -Process {Rename-Item $_ -NewName ("Picture{0:00000000}.jpg" -f $i++) -whatif}

If you're looking for the "basename" and if you're on PowerShell 2.0 just use the Basename property that PowerShell adds to each FileInfo object:

ls *.jpg | Format-Table Basename

Note that on PowerShell 1.0, the PowerShell Community Extensions adds this same Basename property.

If the intent is to append a counter string to the file's basename during the rename operation then try this:

ls *.jpg | Foreach {$i=1} `
   {Rename-Item $_ -NewName ("$($_.Basename){0:00000000#}.jpg" -f $i++) -whatif}

Upvotes: 25

Related Questions