Powershell 使用if条件递归重命名

Powershell 使用if条件递归重命名,powershell,recursion,conditional-statements,Powershell,Recursion,Conditional Statements,我很难将重命名与if条件结合起来。当文件与以前同名时,PS无法重命名,并且以后不会执行任何操作。 此外,它无法递归重命名 我想做一些事情,比如: $entrys = Get-ChildItem -Recurse $myPath foreach ($name in $entrys) { $newName=$name.FullName -replace('[\,\/\*\+\#\~\-\=\^\°\$\%\&\<\>\|]','') if (-not ($newN

我很难将重命名与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
    }
}
$entrys=Get ChildItem-Recurse$myPath
foreach($entrys中的名称){
$newName=$name.FullName-replace(“[\,\/\*\+\\\\\\~-\=\^\°\$\%\&\\\\\\\\\+\\\\\\\+\\\\\\-\=\^\\”,“”)
if(-not($newName-类似$name)){
重命名项$name-NewName$NewName
}
}
我发现了一些类似的东西,但他们没有任何条件

那么,在重命名之前,我如何通过管道进入if条件,以便直接从get childitem-recurse到
if(),然后重命名()
?或者还有其他可能性吗


感谢您的帮助

如果文件具有相同的名称,我的PowerShell不会在
重命名项
cmdlet上引发任何错误。但是您可以尝试使用
-ErrorAction 0

但是,这一行对我来说很有用:

gci $myPath -r | % { Rename-Item  $_.FullName  ($_.FullName -replace('[\,\/\*\+\#\~\-\=\^\°\$\%\&\<\>\|]','')) }
gci$myPath-r |%{重命名项$\.FullName($\.FullName-replace('[\',\/\*\+\\\\\\\\\\-\=\^\°\\\\%\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

当我尝试您的代码时,我遇到了与报告无法重命名文件相同的问题。但是,我对您的代码进行了一些修改,现在它似乎可以工作了:

$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
    }
}
$entrys=Get ChildItem-Recurse$myPath-File
foreach($entrys中的名称){
$newName=$name.name-replace(“[\,\/\*\+\\\\\\~-\=\^\°\$\%\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\+\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
如果($newName-ne$name.name){
重命名项-LiteralPath$name.FullName-NewName$NewName
}
}
首先,您必须只检查文件,而不检查文件夹。因为一旦重命名文件夹,当您递归到不存在的文件夹名称(已更改的名称)时,将不再找到文件

如果您还需要重命名文件夹。由于文件夹名称可能会更改,因此需要进行更多的工作


希望这对您有所帮助。

当我尝试这样做时,我的PS告诉我:重命名项:源路径和目标路径必须不同。您是否可以尝试使用
移动项
而不是
重命名项
我使用的是PowerShell 4.0,如果运行:Rename Item.\foo.txt.\foo.txt,则不会出现任何错误。您使用的是哪个版本会出现错误?我正在运行PS3.0。尝试移动而不是重命名会导致另一个错误,即某些文件“正在使用”。。。不管怎样,@DarkLite1解决了这个问题,我现在很高兴:-)它现在似乎真的起作用了。但我不明白为什么。是因为
-LiteralPath
?对于测试用例,我命名了所有没有任何特殊字符的文件夹,因此文件夹无论如何都不应该被重命名…区别在于我只重命名文件
名称
,而不是
全名
,它也包含路径(请参见变量
$newName
)。如果重新命名,它将不起作用。例如,
\\Server++1\File+1+.txt
无法重命名,因为您希望同时重命名文件夹和文件…不客气!很高兴它帮了你:)别忘了把它标记为已解决。