該当フォルダの年月日が含まれているファイル名をまとめて変更します。
議事録20241101-作業.txtのようなファイルを1つ1つリネームしていました。
量は多くないのですが精神的負担を解消するために作成しました。
以下バッチファイルを実行、同フォルダのパワーシェルが起動して以下の画面のようになります。
変更したい年月日、新しい年月日を入力するとまとめて変更ができます。
@echo off
powershell -executionpolicy RemoteSigned -File ".\%~n0.ps1"
pause
実行するディレクトリの配下のtestフォルダにあるファイルに対して実行しています。
-executionpolicy RemoteSigned:
-executionpolicy オプションは、PowerShell のスクリプト実行ポリシーを指定します。スクリプト実行ポリシーにはいくつかの種類がありますが、RemoteSigned は、ローカルで作成したスクリプトは制限なく実行でき、リモートからダウンロードしたスクリプトは信頼されている証明書が必要であるという設定です。つまり、この設定では、インターネットなどからダウンロードしたスクリプトは、署名されていなければ実行できません。
".%~n0.ps1":
. \ は現在のディレクトリを示す相対パスです。
%~n0 はバッチファイル内で使われる特殊な変数です。バッチファイルの名前を拡張子なしで取得します。%~n0 はバッチファイルの名前そのものを指します。
したがって、%~n0.ps1 は、バッチファイルと同じ名前の .ps1 拡張子を持つ PowerShell スクリプトファイルを指します。例えば、script.bat というバッチファイルがある場合、%~n0.ps1 は script.ps1 を意味します。
#名前を変更するパスを指定
$directory = "$PSScriptRoot\test"
# 古い日付を入力として受け取る
$oldDate = Read-Host "変更したい年月日をYYYYMMDD形式で入力してください(例:20241101)"
# 新しい日付を入力として受け取る
$newDate = Read-Host "新しい年月日をYYYYMMDD形式で入力してください(例:20241201)"
Write-Host "$oldDate -> $newDate"
if ($newDate -match "^\d{8}$" -and $oldDate -match "^\d{8}$") {
# 指定された oldDate に一致するファイルを取得
$files = Get-ChildItem -Path $directory -Filter "*$oldDate*"
if ($files.Count -eq 0) {
# ファイルが見つからない場合
Write-Host "$oldDate が含まれるファイルが存在しません " -ForegroundColor Red
} else {
# 見つかった場合の処理
foreach ($file in $files) {
# 新しいファイル名を作成
$newFileName = $file.Name -replace $oldDate, $newDate
# 新しいファイルのフルパスを作成
$newFilePath = Join-Path -Path $directory -ChildPath $newFileName
# ファイル名を変更(リネーム)
attrib -r $file.FullName
Rename-Item -Path $file.FullName -NewName $newFileName
# 結果を表示
Write-Host "Renamed: $($file.Name) -> $newFileName"
}
}
} else {
Write-Host "YYYYMMDDの形式で入力してください(例:20241101)" -ForegroundColor Red
}
ps1とbatファイルがある配下にtestファイル(対象ディレクトリ)を作っていますが、使用する際はお好きなパスをいれてください。