画像ファイルなどに連番でファイル名を振り直すPowershellスクリプト

コンピュータ

以前、任意のディレクトリ内のファイル名を連番化するスクリプトを作りました。

一括処理をするには良いのですが、対象のファイルを確認しながら柔軟に処理をするのは不向きです。

今回はフォームにファイルをドラック&ドロップすることで連番化処理をするスクリプトを作りました。これでファイルを複数選択しドラック&ドロップを繰り返すことで、目的の並びの連番ファイル名を作成することが出来ます。

スクリプト

<# .SYNOPSIS ファイル名を連番でコピー .DESCRIPTION 画像ファイルなどに連番でファイル名を振り直す。 #>

Set-StrictMode -Version Latest
$ErrorActionPreference = "STOP"

# アセンブリの読み込み
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing


function main {


    $form = New-Object System.Windows.Forms.Form

    $label = New-Object System.Windows.Forms.Label
    $label.Text = "パス:"
    $label.Location = "10,10"
    $label.Size = "30,20"
    $label.TextAlign = "TopCenter"

    $textbox = New-Object System.Windows.Forms.TextBox
    $textbox.Location = "40,10"
    $textbox.Size = "180,20"
    $textbox.Text = [Environment]::GetFolderPath("MyDocument")

    $buttom = New-Object System.Windows.Forms.Button
    $buttom.Location = "220,10"
    $buttom.Size = "60,20"
    $buttom.Text = "選択"
    $buttom.Add_Click({
        $dialog = New-Object System.Windows.Forms.FolderBrowserDialog
        $dialog.SelectedPath = $textbox.Text
        $ret = $dialog.ShowDialog()

        if($ret -eq "OK") {
            $textbox.Text = $dialog.SelectedPath
        }
    })
    
    $label2 = New-Object System.Windows.Forms.Label
    $label2.Text = "現在値:"
    $label2.Location = "10,40"
    $label2.Size = "50,20"
    $label2.TextAlign = "TopCenter"

    $textbox2 = New-Object System.Windows.Forms.TextBox
    $textbox2.Location = "60,40"
    $textbox2.Size = "60,20"
    $textbox2.Text = "1"
    $textbox2.Add_KeyPress({
        if ((($_.KeyChar -lt '0') -Or ('9' -lt $_.KeyChar)) -And ($_.KeyChar -ne "`b")) {
            $_.Handled = $true
        }
    })

    $label3 = New-Object System.Windows.Forms.Label
    $label3.Text = "ここにファイルをドラック&ドロップしてください。"
    $label3.Location = "20,70"
    $label3.Size = "240,180"
    $label3.TextAlign = "MiddleCenter"
    $label3.BorderStyle = "FixedSingle"

    $label3.AllowDrop = $true
    $label3.Add_DragEnter({$_.Effect = "ALL"})
    $label3.Add_DragDrop({
        @($_.Data.GetData("FileDrop")) | % {
            $src = $_
            $ext = [System.IO.Path]::GetExtension($src)
            $seq = [int]$textbox2.Text


            $filename = $seq.ToString("000") + $ext
            $dst = Join-Path $textbox.Text $filename

            while(Test-Path -LiteralPath $dst) {
                $seq = $seq + 1
                if ($seq -gt 999) {
                    throw "オーバーフロー"
                }
                
                $filename = $seq.ToString("000") + $ext
                $dst = Join-Path $textbox.Text $filename
            }

            Copy-Item $src $dst

            $textbox2.Text = $seq
        }
    })



    $form.Controls.AddRange(@($label, $textbox, $buttom, $label2, $textbox2, $label3))

    $form.ShowDialog()
}
main

powershell_ise.exeなどに貼り付けて適当な名前で保存してください。

PowerShellスクリプトを初めて実行する場合

使い方

powershell.exeまたはpowershell_ise.exeから保存したスクリプトを実行してください。
「パス」項目は連番化されたファイルが出力されるディレクトリがセットされています。出力先を変更する場合は「変更」ボタンをクリックするとディレクトリ選択のダイアログが表示されますのでディレクトリを選択してください。
テキストボックスにパスを直接入力することも出来ますが、存在しないパスをセットするとどうなるかは未確認です。(チェックしていません)
「現在値」項目は連番の現在値になります。任意の数値に変更することが出来ます。
「ここにファイルをドロップ&ドロップしてください。」と表示されている場所にファイルをドラック&ドロップすると連番化が実行します。終了すると現在値が加算されます。続けてドラック&ドロップすることも可能です。

出力されるファイル名の形式は数値3桁で、1番目のファイルは「001.拡張子」となります。最大値は999としています。
処理自体はコピーですので元のファイルは残ります。

コメント