私は次のことをしようとしています:
Rename-Item c:\misc\*.xml *.tmp
.tmp
基本的に、ディレクトリ内のすべてのファイルの拡張子を.ではなくに変更したいと思います.xml
。PowerShellでこれを行う簡単な方法を見つけることができないようです。
私は次のことをしようとしています:
Rename-Item c:\misc\*.xml *.tmp
.tmp
基本的に、ディレクトリ内のすべてのファイルの拡張子を.ではなくに変更したいと思います.xml
。PowerShellでこれを行う簡単な方法を見つけることができないようです。
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か所で不要になりました。
これは、目的のディレクトリにいるときにもうまく機能します。
Dir | Rename-Item –NewName { $_.name –replace "old","new" }
既存の回答は-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 -Recurse | where-object -FilterScript {$_.Extension -eq ".xml"} | Rename-Item -NewName {[System.IO.Path]::GetFileNameWithoutExtension($_.fullname) + ".tmp"}
-WhatIfを使用して、最初に結果を評価します
さらに簡単-置換検索文字列は正規表現であることを忘れないでください。
dir *.xml | rename-item -newname {$_.name -replace "xml$","tmp"}
「$」は文字列の終わりを表すため、文字「xml」はファイル名の最後の3文字である必要があります。
これは機能しているようで、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"
}