how to use PowerShell to rename multiple files at once?

This topic contains 3 replies, has 3 voices, and was last updated by Profile photo of John Chen John Chen 7 months, 1 week ago.

Viewing 4 posts - 1 through 4 (of 4 total)
  • Author
    Posts
  • #35237
    Profile photo of John Chen
    John Chen
    Participant

    Basically I have thousands of files. I rename first file as "file0001.txt" for example. Now I want the rest of files to be renamed as "file0002.txt", "file0003.txt", etc. How can I achieve that using PowerShell? Thanks a lot!

    #35238
    Profile photo of Flynn Bundy
    Flynn Bundy
    Participant

    Hi John

    You will want to use a foreach loop to iterate through all the files in your directory. Here is an example:

    get-childitem D:\Stuff\ -File | ForEach-Object {Rename-Item -Path $_.FullName -NewName "NewName$(Get-Random).txt"}
    

    Doing this allows us the pass all the files in D:\Stuff to the Rename-Item Cmdlet. The rename-Item cmdlet needs to know exactly what it's renaming so we use the FullName property from Get-Childitem to do this.

    It's important to note that in the above example this would rename ALL files to this new standard. If you wanted just text files to be renamed you would use a filter on your Get-Childitem cmdlet to only gather these before piping them along. Also, the use of Get-Random here is to just for files since they require a unique name.

    if you wanted an example where the files are named in order you could use something like this, also this example will filter for only .txt files to be renamed:

    $Files = gci D:\Stuff\ -Filter *.txt -file
    
    for ($i = 0; $i -lt $Files.count; $i++){
    
    Rename-Item -Path $Files[$i].FullName -NewName "NewName_$i.txt"
    
    }
    

    Let us know if you require any further help.

    #35249
    Profile photo of Liam Kemp
    Liam Kemp
    Participant

    Hi John,
    If you want to get something similar to "file0001.txt" etc, try

    $files = get-childitem C:\myfiles -recurse | Where { !($_.PSIsContainer) }
    $count = 0
    foreach($file in $files){
    If ($count -lt 10)
    {
    	Rename-Item -path $file.FullName -NewName "file000$count"
    	$count++
    }
    elseif ($count -lt 100)
    {
    	Rename-Item -Path $file.FullName -NewName "file00$count"
    	$count++
    }
    }
    

    I'll walk you through what is happening
    First I'm getting the list of files, in the top folder, and sub folders, and sticking them in a variable. I'm excluding the actual folder objects, if we start renaming those, the whole thing will break.
    Then I create a variable to store the current count, starting at 0.

    Then for every file that we stored earlier, we're going to rename it. If $count is less than 10, i.e. is a single digit number, we'll append "000$count" to the end of our new file name. Then while $count is less than 100 (2 digit number), we stick "00$count" on the end. Obviously, if you want to go all the way to say 9999, you will need to add a couple more "if's", but this will allow you to name the files from 0000 upwards.

    Flynn's method will work, and is much shorter, but I think the files will be named
    file1.txt
    file2.txt
    file3.txt
    file4.txt
    file5.txt
    file6.txt
    file7.txt
    file8.txt
    file9.txt
    file10.txt
    file100.txt
    file1000.txt
    etc – They won't keep the standardised name/length you seem to be after. I could be wrong.

    #35284
    Profile photo of John Chen
    John Chen
    Participant

    Flynn and Liam, thanks so much for your help. I just changed a little bit on your codes to fit my need and it works perfectly!

Viewing 4 posts - 1 through 4 (of 4 total)

You must be logged in to reply to this topic.