I'm facing very weird behavior in Rename-Item
cmdlet.
I want to rename a bunch of files, all residing within the same (current) directory.
Before renaming, I parse original file names, apply some transformation to them, and finally compose resulting file names invoking Rename-Item
command in a loop.
When I add -WhatIf
option to Rename-Item
, I can see it tells me that running it would rename the files correctly. Also, if I output the resulting filename by printing values of the $newFileName
variable before renaming, it is also showing correct new file names.
However, when I remove -WhatIf
option and run the script, nothing is actually renamed and no errors or warnings are displayed!
I did some investigation and found that if I remove + $_.Extension
from the code, the cmdlet actually renames the files, but they will be without extensions, of course. But I can't figure out why it's not working with extension added?!
Example of the original file name:
x 005-Fuji-S-200-CA-6-F81-x 15A RAW.tif
.
The goal is to swap first and last parts of the middle part of the file name, so the resulting name is like x x-Fuji-S-200-CA-6-F81-005 15A RAW.tif
.
The script (it is always run from the directory where the files reside):
Get-ChildItem -File -Filter '*.tif' -Recurse |
ForEach {
$baseNameSpaced = $_.BaseName -split ' '
$filmIdArray = $baseNameSpaced[1] -split '-'
$first = $filmIdArray[0]
$filmIdArray[0] = $filmIdArray[-1]
$filmIdArray[-1] = $first
$baseNameSpaced[1] = $filmIdArray -join '-'
$newFileName = $($baseNameSpaced -join ' ') + $_.Extension
Rename-Item -Path $_.FullName -NewName $newFileName
}
You're modifying the thing you're looping on. Get the complete list of files first. A common practice is to put get-childitem in parentheses so it completes first.
(Get-ChildItem -File -Filter '*.tif' -Recurse) |