Author Posts

November 29, 2014 at 9:31 am

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

November 29, 2014 at 11:06 am

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
}

November 29, 2014 at 11:40 am

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"

November 29, 2014 at 11:44 am

here's screen shot

November 29, 2014 at 1:07 pm

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
}

November 29, 2014 at 3:30 pm

Perfect!

Thank you Mr. Pringle!

November 29, 2014 at 3:51 pm

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

November 30, 2014 at 12:24 am

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. 😉

November 30, 2014 at 7:38 am

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