TL;DR
- あるフォルダ以下の全てのファイルを日付・時刻別にサブフォルダへ移動する PowerShell のスクリプトです
- サブフォルダにしない、日ごとに整理するカスタマイズができます
- 溜まりすぎるスクリーンショットの整理などにお使いください
背景
Windows では Win + Shift + S を同時に押すとスクリーンショットが撮れて、C:\Users\[ユーザ名]\Pictures\Screenshotsにスクリーンショットが png 形式で保存されます。これはこれで便利なのですが、溜まりすぎて放置していると大変な数のスクリーンショットが1つのフォルダに溜まってしまうので、「最新のスクショをアップロードしたい」ときにエクスプローラーがソートしてくれるのを待つ必要があります。
エクスプローラーがソートする対象はフォルダ直下のファイルのみですから、
- 日付でまとめてフォルダ以下のファイルを減らしてソート対象を減らす
- 古いスクショは zip で固めやすいようにフォルダにまとめる
スクリプトを作ることを試みました。
いまの状態
PS > tree /F C:\Users\nitcelcius\Pictures\Screenshots
スクリーンショット 2025-04-02 130520.png
スクリーンショット 2025-04-03 092551.png
スクリーンショット 2025-04-03 092555.png
スクリーンショット 2025-04-03 173124.png
スクリーンショット 2025-04-03 182248.png
(以降1300行略)
エクスプローラーでこのフォルダを開くと、およそ3秒ほどで以下のように整理されます。このときファイルの選択に時間をとっていると突然マウスの下にいるファイルが変わってつらいです(Layout Shift)
実行して整理する
Date2Folder.ps1 をダウンロードしてお好みのエディタで開き、以下の設定を変更します。
とくに Source と Dest は入出力の対象を指定するので、コピペして実行する前に目を通してください。
# 日付時刻の基準。LastWriteTime は更新日時
$FolderByAttribute = [FileDateAttribute]::LastWriteTime
# どのレベルでフォルダを作成するか。Monnth は 年/月 の形式
$AttributeDetailLevel = [DateTimeLevel]::Month
# フォルダ名の区切り文字。/ を指定することで年と月を / で区切ってサブフォルダにする
$FolderNameDelimiter = "/"
# 移動元フォルダ
# ここでは、現在のユーザのスクリーンショットフォルダ
$Source = Join-Path -Path $env:USERPROFILE -childPath "Pictures/Screenshots"
# 移動先フォルダ
# ここでは、現在のユーザの「ピクチャ」下「Screenshots-org」フォルダ (新規作成します)
$Dest = Join-Path -Path $env:USERPROFILE -childPath "Pictures/Screenshots-org"
# 移動ログを出力しない
$IsVerbose = $false
# 実際に移動する (dry-run しない)
$IsDryRun = $false
PowerShell を開いて以下の通り実行します。
./Date2Folder.ps1
結果
$Dest 以下に 年/月 の形式でフォルダが作られ、対応する年月のスクショがサブフォルダにまとまりました ![]()
PS > tree /F C:\Users\nitcelcius\Pictures\Screenshots-org
├───2017
│ ├───01
│ ├───02
│ ├───03
│ ├───05
│ └───06
├───2018
│ ├───02
│ ├───03
│ └───04
(以下32行略)

