2012-11-14 206 views

回答

43

Rename_Item的帮助文档中来自实施例4衍生自具有命令检索到:

get-help Rename-Item -examples 

实施例:

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

注意在替换命令的帮助文档中的解释逸出反斜线由于它使用正则表达式来查找要替换的文本。

+0

谢谢,我一定错过了这个。 –

+2

如果您为重命名指定-WhatIf参数,则它显示操作的输出,而不实际重命名任何内容,这非常有用 –

+0

这实际上是文档IMO中的一个不好的示例。这段代码不等同于'ren * .xml * .tmp'(提示:'a.xml.xml')。你想'System.IO.Path.ChangeExtension':http://stackoverflow.com/a/36241702/67824。 –

15

当您在所需的目录中时,此功能也可以正常工作。

Dir | Rename-Item –NewName { $_.name –replace "old","new" } 
1
dir -Recurse | where-object -FilterScript {$_.Extension -eq ".xml"} | Rename-Item -NewName {[System.IO.Path]::GetFileNameWithoutExtension($_.fullname) + ".tmp"} 

使用-WhatIf评估结果第一

+0

Upvote是因为'-WhatIf'标志。 – Lucubrator

8

现有的答案建议-replace操作,但如果该文件名为a.xml.xml?两个.xml子串将被替换,最终结果将为a.tmp.tmp。幸运的是,对于这样的.NET方法:

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

Manish Kumar接近与GetFileNameWithoutExtension但是这是更优雅和可能有点更高效,而不是它在这种情况下过于事项)

2

这里的另一个将工作的变种。

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

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

0

使用别名缩短的版本是:

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

甚至更​​容易 - 记住,替换搜索字符串是一个正则表达式,

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

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