使用if条件递归重命名

时间:2015-09-01 10:57:25

标签: powershell recursion conditional-statements

我在将重命名与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()?还是有另一种可能吗?

感谢您的帮助

2 个答案:

答案 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('[\,\/\*\+\#\~\-\=\^\°\$\%\&\<\>\|]','')) }