I often have .pdf files where I need to remove ‘- copy’, or replace the date on all of them, etc. So I’ve been using a script to do so. I’m now trying to expand upon my current script to do the same thing ONLY to folders in a given directory, but I’m getting an error on anything that doesn’t contain the characters I want to remove/change.
This is the script I currently use for .pdfs, in this example I just want to remove ABC from everything (i.e. replace it with nothing):
$path = "C:examplepath"
$filter = '*.pdf'
get-childitem -path $path -filter $filter |
rename-item -newname {$_.name -replace 'ABC',''}
And this is what I’ve come up with to do the same, but only on folders (including subfolders):
$FolderPath = "C:examplepath"
Get-ChildItem -Path $FolderPath -Directory -Recurse | rename-item -newname {$_.name -replace 'ABC',''}
It removes ABC from any folder names, but I get the following error for any folders that don’t contain ABC. In this example, the folder was just named ‘1’:
rename-item : Source and destination path must be different.
At line:3 char:55
+ ... Directory -Recurse | rename-item -newname {$_.name -replace 'ABC',''}
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : WriteError: (C:examplepath1:String) [Rename-Item], IOException
+ FullyQualifiedErrorId : RenameItemIOError,Microsoft.PowerShell.Commands.RenameItemCommand
I kind of understand what it’s saying by ‘source and destination path must be different’- it can’t change a folder named ‘1’ to a folder named ‘1’. But I don’t understand why I’m getting that error now, but not when I run my .pdf script. It’s not the end of the world since the script does what I want, but I’d be more comfortable if it wasn’t returning errors.
Use a filter to ensure you’re renaming a folder that does have ABC
in its name. You should also probably consider start renaming them from the deepest in hierarchy, so Sort-Object
on FullName
:
$FolderPath = 'C:examplepath'
Get-ChildItem -Path $FolderPath -Directory -Recurse |
Where-Object Name -Like *ABC* |
Sort-Object FullName -Descending |
Rename-Item -NewName { $_.Name -replace 'ABC' }
As for the error, reason is that if you rename a file using its same name it isn’t an issue but for a directory it’s different, it must have a different name, thus the need for a filter, that’s how the underlying .NET APIs work when renaming.
2
I don’t understand why I’m getting that error now, but not when I run my .pdf script
That’s because Rename-Item
calls different .NET methods based on whether the item is a directory or a file – and DirectoryInfo.MoveTo()
happens to throw errors when you request a local move to the same path, whereas FileInfo.MoveTo()
does not.
As to why the check is in place for directories but not files, you’d have to ask the developers who implemented those methods 🙂
1