String Manipulation and Renaming

This topic contains 8 replies, has 2 voices, and was last updated by Profile photo of H Man H Man 2 years ago.

  • Author
    Posts
  • #20860
    Profile photo of H Man
    H Man
    Participant

    Hi All

    I am looking to grab a bunch of files and rename them.

    In the middle of the file name there is a 'time stamp' string that i need to remove.by doing so I am creating duplicate file names and getting this error

    "Rename-Item : Cannot create a file when that file already exists."

    I am looking for some logic that when this error occurs to randomly name the files something slightly different so both files can co-exist in the same directory.

    heres an example of what i have so far

    
    # File1 =  c:\temp\11-28-2014-06-40-46-UPS--On-battery-power-in-response-to-an-input-power-problem.msg          
    # File2  = c:\temp\11-28-2014-06-40-52-UPS--No-longer-on-battery-power.msg    
    
    
    $Source = gci C:\temp | ? {$_.Extension -match '.msg'}
    foreach ($file in  $Source) {
    $path = $file.FullName 
    $oldname = $file.name.Remove(10,9)
    $newname = $oldname
    Rename-Item -Path $path  -NewName "$($newname)$($_.Extension)" -Force
     }
    
    

    Thank you

  • #20861
    Profile photo of Tim Pringle
    Tim Pringle
    Participant

    Hey fella,

    You could try something like below. It does a check to see if the file exists already and if it does goes through a loop which gives it a _copyx where x incremements each time until a unique name is found.

    # File1 =  c:\temp\11-28-2014-06-40-46-UPS–On-battery-power-in-response-to-an-input-power-problem.msg          
    # File2  = c:\temp\11-28-2014-06-40-52-UPS–No-longer-on-battery-power.msg    
     
    
    Set-Location -Path C:\Temp 
    $Source = Get-ChildItem -Path C:\temp | Where-Object -FilterScript {
      $_.Extension -match '.msg'
    }
    foreach ($file in  $Source) 
    {
      $path = $file.FullName 
      $oldname = $file.name.Remove(10,9)
      $newname = $oldname
    
      $newFileName = "$($newname)$($_.Extension)"
      $fileAlreadyExists = Test-Path $newFileName
      $index = 0
    
      While ($fileAlreadyExists) 
      {
        $index += 1
        $newFileName = "$($newname)_copy$($index)$($_.Extension)"
        $fileAlreadyExists = Test-Path $newFileName
      }
    
    
      Rename-Item -Path $path  -NewName $newFilename -Force
    }
    
  • #20862
    Profile photo of H Man
    H Man
    Participant

    HI

    Thank you for the reply

    the files that are copy1 the file name extension is actually becoming _copy and not .msg

    its replacing the .msg with _copy1

    "C:\temp\11-28-2014-UPS–On-battery-power-in-response-to-an-input-power-problem..msg_copy1"

  • #20863
    Profile photo of H Man
    H Man
    Participant

    here's screen shot

  • #20865
    Profile photo of Tim Pringle
    Tim Pringle
    Participant

    oops, try this.

    # File1 =  c:\temp\11-28-2014-06-40-46-UPS–On-battery-power-in-response-to-an-input-power-problem.msg          
    # File2  = c:\temp\11-28-2014-06-40-52-UPS–No-longer-on-battery-power.msg    
     
     
    Set-Location -Path C:\Temp 
    $Source = Get-ChildItem -Path C:\temp | Where-Object -FilterScript {
      $_.Extension -match '.msg'
    }
    foreach ($file in  $Source) 
    {
      $path = $file.FullName 
      $oldname = $file.name.Remove(10,9)
      $extension = $file.extension
    
      $newFilename = $oldname
      
      $fileAlreadyExists = Test-Path $newFileName
      
      $index = 0
      $basename = $NewFileName.Substring(0,$newFilename.Length-4)
    
      While ($fileAlreadyExists) 
      {
        $index += 1
        $newFileName = "$($basename)_copy$($index)$($Extension)"
        $fileAlreadyExists = Test-Path $newFileName
      }
     
     
      Rename-Item -Path $path  -NewName $newFileName -Force
    }
    
    
  • #20866
    Profile photo of H Man
    H Man
    Participant

    Perfect!

    Thank you Mr. Pringle!

  • #20867
    Profile photo of H Man
    H Man
    Participant

    Actually after running it against a big set of 2000k + files I am getting this error

    Rename-Item : Cannot rename because item at
    'C:\Temp\Email\11-26-2014-10-45-01-[SUPPORT-#426760]–Rick'-Home-VPN.msg' does not exist.
    At line:26 char:3

    but the file is there

  • #20868
    Profile photo of Tim Pringle
    Tim Pringle
    Participant

    Hmmm.....It's mentioning an 'email' folder, but the script only parses the top level Temp folder. Is it just with one file it's doing or multiple? Also is it only with ones in a subfolder?

    'Mr Pringle'? That's shocking! i feel old enough as it is, 'Tim' is much better for my emotional wellbeing. thnx. 😉

  • #20869
    Profile photo of H Man
    H Man
    Participant

    haha sorry about that Tim lol

    even when i set the location to the 'email' folder which is the top level and no sub folders it still throws he error But it is renaming everything correctly so idk

    it is working as intended but generating the error. If test with just 4 files no error, its when i run it against 2,000 files it happens

    either way it is working so thank you for all your help

You must be logged in to reply to this topic.