如何在PowerShell中批量重命名文件?

我正在尝试执行以下操作:

Rename-Item c:\misc\*.xml *.tmp 

我基本上想要将目录中每个文件的扩展名改为.tmp而不是.xml 。 我似乎无法find一个简单的方法来在PowerShell中做到这一点。

Solutions Collecting From Web of "如何在PowerShell中批量重命名文件?"

从命令检索的Rename_Item的帮助文档中的示例4派生而来:

 get-help Rename-Item -examples 

例:

 Get-ChildItem *.xml | Rename-Item -NewName { $_.Name -replace '\.xml','.tmp' } 

请注意帮助文档中有关替换命令中的转义反斜杠的说明,因为它使用正则表达式来查找要替换的文本。

当你在所需的目录中时,这也可以工作。

 Dir | Rename-Item –NewName { $_.name –replace "old","new" } 

现有的答案建议-replace操作符,但是如果文件被称为a.xml.xml怎样? 两个.xml子字符串都将被替换,最终结果将是a.tmp.tmp 。 幸运的是,有一个.NET的方法:

 Dir *.xml | rename-item -newname { [io.path]::ChangeExtension($_.name, ".tmp") } 

( Manish Kumar与GetFileNameWithoutExtension很接近,但是这更优雅,可能效率更高一些,并不是说在这种情况下它过于重要)

这是另一个可以工作的变体。

 dir *.xml | Rename-Item -NewName {$_.BaseName + ".tmp"} 

$_.BaseName将执行没有(最后)扩展名的“基本”名称。

更简单 – 记住替换搜索字符串是一个正则表达式,

 dir *.xml | rename-item -newname {$_.name -replace "xml$","tmp"} 

“$”代表字符串的结尾,所以字符“xml”必须是文件名的最后三个字符。

 dir -Recurse | where-object -FilterScript {$_.Extension -eq ".xml"} | Rename-Item -NewName {[System.IO.Path]::GetFileNameWithoutExtension($_.fullname) + ".tmp"} 

使用-WhatIf首先评估结果

使用别名的缩短版本将是:

 ls *.xml | ren -new {$_.BaseName + ".tmp"}