我在将重命名与if条件相结合时遇到了很大的麻烦。当文件与之前的名称相同时,PS无法重命名,之后不会做任何事情。 此外,它无法递归重命名。
我想做某事:
$entrys = Get-ChildItem -Recurse $myPath
foreach ($name in $entrys) {
$newName=$name.FullName -replace('[\,\/\*\+\#\~\-\=\^\°\$\%\&\<\>\|]','')
if (-not ($newName -like $name)) {
Rename-Item $name -NewName $newName
}
}
我找到了类似的here,但他们没有任何条件。
那么在重命名之前如何管道if-condition,所以我可以直接从get-childitem -recurse管道到if() then rename()
?还是有另一种可能吗?
感谢您的帮助
答案 0 :(得分:2)
当我尝试您的代码时,我遇到了同样的问题,它报告它无法重命名该文件。但是,我修改了一些代码,现在它似乎有用了:
$entrys = Get-ChildItem -Recurse $myPath -File
foreach ($name in $entrys) {
$newName = $name.Name -replace('[\,\/\*\+\#\~\-\=\^\°\$\%\&\<\>\|]','')
if ($newName -ne $name.Name) {
Rename-Item -LiteralPath $name.FullName -NewName $newName
}
}
首先,你必须只检查文件而不是文件夹。因为重新命名文件夹后,当您递归到非现有文件夹名称(已更改的文件夹名称)时,不再找到文件。
如果您还需要重命名文件夹。由于文件夹名称可能会发生变化,因此需要更多工作。
希望这可以帮助你。
答案 1 :(得分:1)
如果文件名相同,我的PowerShell不会在Rename-Item
cmdlet上抛出任何错误。但您可以尝试使用-ErrorAction 0
。
然而,这个oneliner对我有用:
gci $myPath -r | % { Rename-Item $_.FullName ($_.FullName -replace('[\,\/\*\+\#\~\-\=\^\°\$\%\&\<\>\|]','')) }