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

时间:2012-11-14 16:13:49

标签: windows powershell

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

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

我基本上想要将目录中每个文件的扩展名更改为.tmp而不是.xml。我似乎无法在PowerShell中找到一种直接的方法。

8 个答案:

答案 0 :(得分:49)

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

get-help Rename-Item -examples

示例:

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

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

答案 1 :(得分:16)

当你在所需的目录中时,这也很有效。

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

答案 2 :(得分:8)

现有答案提示-replace运算符,但如果文件名为a.xml.xml怎么办?两个.xml子字符串都将被替换,最终结果将为a.tmp.tmp。幸运的是,有一种.NET方法:

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

Manish KumarGetFileNameWithoutExtension接近,但这更优雅,可能更有效率,而不是在这种情况下过于重要)

答案 3 :(得分:2)

这是另一种可行的变体。

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

$_.BaseName将执行" base"没有(最后)扩展名的名称。

答案 4 :(得分:1)

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

使用-WhatIf首先评估结果

答案 5 :(得分:1)

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

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

答案 6 :(得分:1)

更容易 - 请记住,替换搜索字符串是正则表达式,

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

“$”表示字符串结尾,因此字符“xml”必须是文件名的最后三个字符。

答案 7 :(得分:0)

这似乎是有效的,并且是一种Python语言,即简单的方法要比复杂的(https://www.python.org/dev/peps/pep-0020/)方法好(一旦您在目录中):

$files = Get-ChildItem -file -Filter *.xml;
  ForEach ($file in $files)
  {
  $n = $file.Basename
  Copy-Item -Path $file -Destination "$n.tmp"
  Remove-Item "$n.xml"
  }