我正在尝试执行以下操作:
Rename-Item c:\misc\*.xml *.tmp
我基本上想要将目录中每个文件的扩展名更改为.tmp
而不是.xml
。我似乎无法在PowerShell中找到一种直接的方法。
答案 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 Kumar与GetFileNameWithoutExtension
接近,但这更优雅,可能更有效率,而不是在这种情况下过于重要)
答案 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"
}