51

私は次のことをしようとしています:

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

.tmp基本的に、ディレクトリ内のすべてのファイルの拡張子を.ではなくに変更したいと思います.xml。PowerShellでこれを行う簡単な方法を見つけることができないようです。

4

8 に答える 8

76

Rename-Itemコマンドで取得したのヘルプドキュメントの例4から:

get-help Rename-Item -examples

例:

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

置換するテキストを見つけるために正規表現を使用しているため、replaceコマンドでバックスラッシュをエスケープするためのヘルプドキュメントの説明に注意してください。

正規表現-replace演算子が文字列の最後の拡張子のみと一致するようにするには、正規表現の文字列の終わりの文字を含めます$

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

これは、コメントで@OhadSchneiderによって言及されたケースを処理します。この場合、名前の付いたファイルがあり、lorem.txt.txt最終的にはでlorem.txt.logはなくなりlorem.log.logます。

正規表現が十分に厳密にターゲットにされ、@ etoxinの回答に触発されたので、次のようにコマンドをより使いやすくすることができます。

Get-ChildItem | Rename-Item -NewName { $_.Name -replace '\.txt$','.log' }

つまり、正規表現がパイプの後で十分にフィルタリングされている場合は、パイプの前でフィルタリングする必要はありません。また、コマンド文字列を変更すること(たとえば、上記のコマンドをコピーして、それを使用して「.xml」ファイルの拡張子を変更する場合)は、2か所で不要になりました。

于 2012-11-14T16:30:56.040 に答える
17

これは、目的のディレクトリにいるときにもうまく機能します。

Dir | Rename-Item –NewName { $_.name –replace "old","new" }
于 2013-05-07T04:21:18.890 に答える
12

既存の回答は-replace演算子を示唆していますが、ファイルが呼び出された場合はどうなりますa.xml.xmlか?両方の.xml部分文字列が置き換えられ、最終結果はになりますa.tmp.tmp。幸い、これには.NETメソッドがあります。

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

Manish Kumarは親密でしたGetFileNameWithoutExtensionが、これはよりエレガントで、おそらくもう少し効率的であり、この場合は過度に重要ではありません)

于 2016-03-26T22:37:13.800 に答える
5

これが機能する別のバリ​​アントです。

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

$_.BaseName(最後の)拡張子なしで「ベース」名を実行します。

于 2017-01-16T21:16:46.317 に答える
4

エイリアスを使用した短縮バージョンは次のようになります。

ls *.xml | ren -new {$_.BaseName + ".tmp"}
于 2017-04-20T04:46:09.917 に答える
2
dir -Recurse | where-object -FilterScript {$_.Extension -eq ".xml"} | Rename-Item -NewName {[System.IO.Path]::GetFileNameWithoutExtension($_.fullname) + ".tmp"}

-WhatIfを使用して、最初に結果を評価します

于 2014-10-23T01:10:46.493 に答える
2

さらに簡単-置換検索文字列は正規表現であることを忘れないでください。

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

「$」は文字列の終わりを表すため、文字「xml」はファイル名の最後の3文字である必要があります。

于 2017-07-18T15:16:46.407 に答える
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"
  }
于 2018-11-12T23:22:21.913 に答える