我试图做到以下几点:如何在PowerShell中批量重命名文件?
Rename-Item c:\misc\*.xml *.tmp
我基本上要到一个目录内改变每一个文件的扩展名来.tmp
而不是.xml
。我似乎无法找到在PowerShell中执行此操作的简单方法。
我试图做到以下几点:如何在PowerShell中批量重命名文件?
Rename-Item c:\misc\*.xml *.tmp
我基本上要到一个目录内改变每一个文件的扩展名来.tmp
而不是.xml
。我似乎无法找到在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" }
dir -Recurse | where-object -FilterScript {$_.Extension -eq ".xml"} | Rename-Item -NewName {[System.IO.Path]::GetFileNameWithoutExtension($_.fullname) + ".tmp"}
使用-WhatIf评估结果第一
Upvote是因为'-WhatIf'标志。 – Lucubrator
现有的答案建议-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
将执行没有(最后)扩展名的“基本”名称。
使用别名缩短的版本是:
ls *.xml | ren -new {$_.BaseName + ".tmp"}
甚至更容易 - 记住,替换搜索字符串是一个正则表达式,
dir *.xml | rename-item -newname {$_.name -replace "xml$","tmp"}
的“$”代表最终OF-字符串,所以字符“xml”必须是文件名的最后三个字符。
谢谢,我一定错过了这个。 –
如果您为重命名指定-WhatIf参数,则它显示操作的输出,而不实际重命名任何内容,这非常有用 –
这实际上是文档IMO中的一个不好的示例。这段代码不等同于'ren * .xml * .tmp'(提示:'a.xml.xml')。你想'System.IO.Path.ChangeExtension':http://stackoverflow.com/a/36241702/67824。 –