我在Rename-Item
cmdlet中遇到了非常奇怪的行为。
我想重命名一堆文件,它们都位于同一(当前(目录中。在重命名之前,我解析原始文件名,对它们进行一些转换,最后在循环中调用Rename-Item
命令来编写生成的文件名。
当我将-WhatIf
选项添加到Rename-Item
时,我可以看到它告诉我运行它将正确重命名文件。此外,如果我在重命名前通过打印$newFileName
变量的值来输出结果文件名,它也会显示正确的新文件名。
但是,当我删除-WhatIf
选项并运行脚本时,实际上没有重命名任何内容,也没有显示任何错误或警告!
我做了一些调查,发现如果我从代码中删除+ $_.Extension
,cmdlet实际上会重命名文件,但它们当然没有扩展名。但我不明白为什么添加了扩展后它就不起作用了?!
原始文件名示例:x 005-Fuji-S-200-CA-6-F81-x 15A RAW.tif
。
目标是交换文件名中间部分的第一部分和最后一部分,因此生成的名称类似于x x-Fuji-S-200-CA-6-F81-005 15A RAW.tif
。
脚本(它总是从文件所在的目录中运行(:
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
}
您正在修改循环的内容。首先获取完整的文件列表。一种常见的做法是将getchilditem放在括号中,以便它首先完成。
(Get-ChildItem -File -Filter '*.tif' -Recurse) |