見出し画像

ファイル名の変更が面倒なのでpowershellで『フォルダにファイルが追加された瞬間勝手に名前が変わるスクリプト』作ってみた(ChatGPTが)

前回、ファイル名の一括変更が面倒ということで、ファイルをドラッグしたらダイアログがでてきて、そこに変更後の名前を入力するという楽なんだかよくわからないスクリプト(作業の手間はむしろ増えているので楽になったのは誤爆の緊張感から解放された意識だけ)をChatGPTに作らせたのですが、実際に使う前にもっといい方法を思いついたのでお蔵入りになりました。

そのもっといい方法というのが、『フォルダにファイルが追加された瞬間勝手に名前が変わる』というものです。
いまの作業環境はフォルダごとに命名規則が決まっているので、名前を変更してからフォルダごとに仕訳ける必要があるわけです。
ならもう、特定のフォルダに入ったファイルは即、決められた命名規則に変わればいいわけです。

というわけで早速ChatGPTにお願いしてみる。前回のよくわからん名前変更スクリプトより圧倒的に早く完成して若干悲しみ😢

これがそのpowershellのスクリプト

# 監視するフォルダと新しいファイル名のベースをハッシュテーブルで定義
$foldersToWatch = @{
    "C:\Users\user\Downloads\テスト用" = "FirstFolder_fastName_"# 監視するフォルダのアドレスと新しいファイル名のベースを入力
    "C:\Users\user\Downloads\テスト用2" = "SecondFolder_secondName_"
}

foreach ($folder in $foldersToWatch.Keys) {
    $newNameBase = $foldersToWatch[$folder]
    
    # バックグラウンドジョブとして監視を開始
    Start-Job -ScriptBlock {
        param($folder, $newNameBase)
        
        # 監視するファイルの種類(例: *.txt)
        $filter = "*.txt" 
        $fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property @{
            IncludeSubdirectories = $false
            EnableRaisingEvents = $true
        }

        $action = {
            param($source, $e)
            $newFilePath = $e.FullPath
            $counter = 1
            $extension = [IO.Path]::GetExtension($newFilePath)
            $newFileName = "${newNameBase}${counter}${extension}"
            $newPath = Join-Path (Split-Path -Parent $newFilePath) $newFileName
            
            # ファイル名を変更
            while (Test-Path $newPath) {
                $counter++
                $newFileName = "${newNameBase}${counter}${extension}"
                $newPath = Join-Path (Split-Path -Parent $newFilePath) $newFileName
            }
            Rename-Item -Path $newFilePath -NewName $newFileName -ErrorAction Stop
        }

        Register-ObjectEvent -InputObject $fsw -EventName Created -Action $action

        # スクリプトが終了しないように待機
        while ($true) {
            Start-Sleep -Seconds 1
        }
    } -ArgumentList @($folder, $newNameBase)
}

これを動かした状態でファイルを移動させると、、、

勝手に名前が変更される!!

ここから、別のファイル名を指定しているフォルダに移すと、、、

こっちもどんどん変わっていく!

トリガーはファイルが『追加された時』なので、新規作成とフォルダ移動した場合のみファイル名が変わるようになっています。そのため、移動後に名前を変えたものはそのままになるのが助かる。何が何でも指定した名前に変更する因果律が働いていたら使い物にならないところだった。
まあ、うっかり関係ないファイルを移動させたら大惨事になるのは目に見えてますが、、、
実務より嫌がらせの方がはるかに実用性高そうで嫌ですね~

とりあえずpowershellセッションが開いている間は動作します。powershellを閉じるとジョブも終了するらしいけど、ほんとかなぁ。
止め方よくわかんないんだよね。

いちおう

Get-Job

で動作中のジョブを確認して

Stop-Job -Id <ジョブのID>

で停止

Remove-Job -Id <ジョブのID>

で削除できるらしいけどホントに止まってるのか確認の仕方がわからん。

なので

Get-Job | Remove-Job

で全部のジョブをまとめて削除してます。

ChatGPTくん曰く、『長期間実行させたい場合は、Windowsのタスクスケジューラを使用するか、別の長期実行サービスを検討してください。』
とのことですが、常に必要なわけじゃないからそこはノータッチ

これでフォルダの仕分けとリネーム作業、ちょっとは楽になればいいなぁ

この記事が気に入ったらサポートをしてみませんか?