PowerShell
アイキャッチ 猫

こんにちは!前回はファイル名を一括でリネームする方法について、ご紹介いたしました。
今回はファイル名に連番を振る際にキーを設定してキーの値が変わった時に連番が初期化する方法をご紹介します。

前回の記事はこちらです!
良かったらご覧ください。

※ 筆者がC#での書き方が慣れているため、もっとより良い記述方法があるかもしれません。
その際は記事を更新させていただきます。

前回の記事では、Rename-Itemを使用していましたが、今回は出力先フォルダを変更したかったので、Copy-Itemを使用して、ファイル名を変更しながらコピー処理をする方法を取りました。

やりたいこと

こちらが処理前のディレクトリ構成です。

処理前のフォルダ構成

各画像ファイル名の頭4桁「a001」等をキーに連番を振っていきます。
例えば「a001」から「a002」に変わると、また連番が001始まりになります。

処理後のフォルダ構成のイメージ

サンプルコード

# 1.フォルダパス設定
$in_folder = "c:\sample\in"
$out_folder = "c:\sample\out"

# 2.処理するファイル一覧情報を取得
$file_list = Get-ChildItem $in_folder | sort Name

# 3.連番付与するための変数を初期化
$cnt = 0
$hold_key = ""
foreach($file in $file_list){
    # 4.コピー元パス設定
    $in_file_path = $in_folder + "\" + $file.Name

    # 5.連番設定(キーブレイク)
    $now_key = $file.Name.Substring(0, 4)
    if($hold_key -ne $now_key){
        $cnt = 0
        $hold_key = $now_key
    }
    $cnt++

    # 6.コピー先パス設定
    $out_file_path = $out_folder + "\" + $now_key + "_picture_" + $cnt.ToString("D3") + $file.Extension

    # 7.ファイルコピー
    Copy-Item $in_file_path $out_file_path
}

以下、コードの解説です。

1.$in_folder、$out_folderにそれぞれコピー元とコピー先のフォルダのパスを設定

2.処理するファイルの情報を一覧で取得
また、ファイル名順で処理するよう、取得する際にファイル名でソートをかける

3.連番を付与する変数($cnt、$hold_key)を初期化

4.コピー元ファイルパスを設定

5.連番のカウント処理
1つ前のファイル名とキーが異なる場合、連番リセット

6.コピー先ファイルパスを設定

7.ファイルコピー処理

4~7まで全ファイル分処理を続ける

このコードを実行すると、コピー先フォルダに画像ファイルがリネームされてコピーされます。

終わりに

いかがでしたでしょうか?
前回同様、コードをコピペして少し変更するだけで簡単に試せるので是非やってみてください!