対象ディレクトリ内のファイルすべてをリネームする

スクリプトファイルを書いて ForEach でループして実施する方法と、コマンドライン1行で実施する二つの方法を紹介します。

スクリプトファイルを書いて連続リネームする方法

下記の手法を組み合わせて実現します。

(1) ディレクトリ内のすべてのファイルのフルパスリストを取得する.
(2) フルパスリストを ForEach でループし、変更前のフルパスを取得する。
(3) フルパスの中で文字列を置換する。
(4) 変更前のフルパスと、変更後のフルパスを使ってファイルリネームを実施する。

上記の(3)において、文字列の変更は Replace( "置換対象の文字列", "置換後の文字列" ) で実施します。

上記の(4)において、ファイルのリネームは Rename-Item "リネーム前のフルパス" "リネーム後のフルパス" で実施します。

下記のサンプルソースでは

c:/tmp/rec/before_000.png から c:/tmp/rec/after_000.png にリネームします。
c:/tmp/rec/before_001.png から c:/tmp/rec/after_001.png にリネームします。
c:/tmp/rec/before_002.png から c:/tmp/rec/after_002.png にリネームします。
c:/tmp/rec/before_003.png から c:/tmp/rec/after_003.png にリネームします。
c:/tmp/rec/before_004.png から c:/tmp/rec/after_004.png にリネームします。
c:/tmp/rec/before_005.png から c:/tmp/rec/after_005.png にリネームします。
c:/tmp/rec/before_006.png から c:/tmp/rec/after_006.png にリネームします。
c:/tmp/rec/before_007.png から c:/tmp/rec/after_007.png にリネームします。

# 対象のディレクトリ内のファイル.
$target = "c:/tmp/rec/*.png"

# 対象のディレクトリに存在するファイルパスのリストを配列として取得する.
$arr = Get-ChildItem $target | ForEach-Object {$_.FullName}

# リネームのカウンタ.
$counter = 0

# ForEachループでリネームする.
ForEach ( $item in $arr )
{
    # 一つのファイルパスを取り出す.
    $src = $item
    
    # ファイルパスの文字列を置換する.
    $dst = $src.Replace( "before_", "after_" )

    # ファイルの名前をリネームする.
    Rename-Item $src $dst

    # カウンタをインクリメントする.
    $counter++
}

# リネームの個数を表示する.
Write-Host( "{0} files are renamed." -f $counter )

# 終了を表示する.
Write-Host ( "finished." )

この方法を応用すれば、ディレクトリ内のファイルすべての拡張子を htm から html にしたり、jpg から jpeg にしたりできます。

コマンドライン1行で連続リネームする方法

Get-ChildItem コマンドからパイプをつかって Rename-Item コマンドへデータを流します。一行で書けます。いわゆるワンライナーです。

c:\tmp\test> Get-ChildItem | Rename-Item -NewName {$_.Name -Replace "before_", "after_" }