日付フォルダを作るbat自体は昔からよくある小技ですが、
今回はそこから一歩進めて、作成した日付フォルダの中に
時間フォルダ作成用のbatファイルも自動配置する形にしました。
この一手間が、利便性を大きく向上させます。
想定するフォルダ構成の例
作業フォルダ
├ 日付フォルダ自動生成.bat
│
├ 20260706
│ ├ 時間フォルダ自動生成.bat
│ │
│ ├ 0930
│ │ └ 作業メモ.txt
│ │
│ ├ 1032
│ │ ├ 検証結果.txt
│ │ └ スクリーンショット.png
│ │
│ ├ 1048
│ │ └ 修正版データ.xlsx
│ │
│ └ 1530
│ ├ 提出前チェック.txt
│ └ バックアップ.zip
│
└ 20260707
├ 時間フォルダ自動生成.bat
│
├ 0915
│ └ 作業開始メモ.txt
│
├ 1120
│ ├ 確認用資料.pdf
│ └ 修正メモ.txt
│
└ 1645
└ 提出版.zip
網羅性はありませんが、ChatGPTなどのAIに添付して、安全か聞いてから使う事を推奨します。プログラマーやSEの方は、可能ならばBase64もデコードして目視チェック願います。
なお、時間フォルダ作成用batの中身を親bat内に平文で埋め込もうとすると、echo、@、改行、特殊文字の扱いでうまく動かない箇所が出たため、今回はBase64で埋め込む形にしています。読みにくくなる点はありますが、実行前にBase64部分をデコードして中身を確認していただく前提でご容赦下さい。
紹介するbatファイルの中身
@echo off
setlocal
rem This file is ASCII-only to avoid Japanese filename garbling.
rem Date folder: yyyyMMdd
rem Child bat filename: generated from Unicode code points in PowerShell.
set "BAT_BASE=%~dp0"
set "TIME_BAT_B64=QGVjaG8gb2ZmDQpzZXRsb2NhbA0KDQpyZW0gYmF044OV44Kh44Kk44Or44GM44GC44KL5aC05omA44G456e75YuVDQpjZCAvZCAiJX5kcDAiDQoNCnJlbSDmmYLliLvjgpIgSEhtbSDlvaLlvI/jgaflj5blvpcNCmZvciAvZiAlJUEgaW4gKCdwb3dlcnNoZWxsIC1Ob1Byb2ZpbGUgLUNvbW1hbmQgIkdldC1EYXRlIC1Gb3JtYXQgSEhtbSInKSBkbyBzZXQgIk5PV1RJTUU9JSVBIg0KDQpyZW0g44OV44Kp44Or44OA5L2c5oiQDQppZiBub3QgZXhpc3QgIiVOT1dUSU1FJSIgKA0KICAgIG1rZGlyICIlTk9XVElNRSUiDQogICAgZWNobyDkvZzmiJDjgZfjgb7jgZfjgZ86ICVOT1dUSU1FJQ0KKSBlbHNlICgNCiAgICBlY2hvIOaXouOBq+WtmOWcqOOBl+OBvuOBmTogJU5PV1RJTUUlDQop"
powershell -NoProfile -ExecutionPolicy Bypass -Command ^
"$ErrorActionPreference='Stop';" ^
"$base=$env:BAT_BASE;" ^
"$today=Get-Date -Format yyyyMMdd;" ^
"$dateDir=Join-Path -Path $base -ChildPath $today;" ^
"New-Item -ItemType Directory -Path $dateDir -Force | Out-Null;" ^
"$codes=26178,38291,12501,12457,12523,12480,33258,21205,29983,25104,46,98,97,116;" ^
"$fileName=-join ($codes | ForEach-Object {[char]$_});" ^
"$out=Join-Path -Path $dateDir -ChildPath $fileName;" ^
"$bytes=[Convert]::FromBase64String($env:TIME_BAT_B64);" ^
"[System.IO.File]::WriteAllBytes($out,$bytes);" ^
"Write-Host ('Created: ' + $out);"
if errorlevel 1 (
echo Failed.
) else (
echo Done.
)
endlocal
安全か確認するために、Base64をデコードして、コードを確認するのが良いと思います。
新しいテキストファイルを新規作成して、中身を上記の内容にした後、ファイル名を「日付フォルダ自動生成.bat」にして使用します。拡張子をtxtではなくbatにする必要があります。
フォルダを移動してしまった時の保険機能実装版
@echo off
setlocal
rem This file is ASCII-only to avoid Japanese filename garbling.
rem Date folder: yyyyMMdd
rem Child bat filename: generated from Unicode code points in PowerShell.
set "BAT_BASE=%~dp0"
set "TIME_BAT_B64=QGVjaG8gb2ZmDQpzZXRsb2NhbA0KDQpyZW0gTW92ZSB0byB0aGUgZm9sZGVyIHdoZXJlIHRoaXMgYmF0IGZpbGUgZXhpc3RzLg0KY2QgL2QgIiV+ZHAwIg0KDQpyZW0gR2V0IHRpbWUgYXMgSEhtbS4NCmZvciAvZiAlJUEgaW4gKCdwb3dlcnNoZWxsIC1Ob1Byb2ZpbGUgLUNvbW1hbmQgIkdldC1EYXRlIC1Gb3JtYXQgSEhtbSInKSBkbyBzZXQgIk5PV1RJTUU9JSVBIg0KDQpyZW0gVXNlIHRoZSBwYXJlbnQgZGF0ZSBmb2xkZXIgbmFtZSBhcyB5eXl5TU1kZCB3aGVuIHBvc3NpYmxlLg0KZm9yICUlRCBpbiAoIiVDRCUiKSBkbyBzZXQgIkRBVEVQQVJUPSUlfm54RCINCmVjaG8oJURBVEVQQVJUJXwgZmluZHN0ciAvciAiXlswLTldWzAtOV1bMC05XVswLTldWzAtOV1bMC05XVswLTldWzAtOV0kIiA+bnVsDQppZiBlcnJvcmxldmVsIDEgKA0KICAgIGZvciAvZiAlJUEgaW4gKCdwb3dlcnNoZWxsIC1Ob1Byb2ZpbGUgLUNvbW1hbmQgIkdldC1EYXRlIC1Gb3JtYXQgeXl5eU1NZGQiJykgZG8gc2V0ICJEQVRFUEFSVD0lJUEiDQopDQoNCnJlbSBDcmVhdGUgSEhtbSBmb2xkZXIgYW5kIGFuIGluc3VyYW5jZSBmaWxlIGluc2lkZSBpdC4NCnJlbSBUaGUgZmlsZSBuYW1lIGtlZXBzIHl5eXlNTWRkX0hIbW0gZXZlbiBpZiB0aGUgSEhtbSBmb2xkZXIgaXMgbW92ZWQgZWxzZXdoZXJlLg0KcmVtIFRoZSBmaWxlIHRleHQgc2F5cyB0aGF0IHRoaXMgaXMgYW4gaW5zdXJhbmNlIGZpbGUgZm9yIG1vdmVkIGZvbGRlcnMuDQppZiBub3QgZXhpc3QgIiVOT1dUSU1FJSIgKA0KICAgIG1rZGlyICIlTk9XVElNRSUiDQogICAgZWNobyBDcmVhdGVkIGZvbGRlcjogJU5PV1RJTUUlDQopIGVsc2UgKA0KICAgIGVjaG8gQWxyZWFkeSBleGlzdHM6ICVOT1dUSU1FJQ0KKQ0KDQpzZXQgIk1BUktFUj0lTk9XVElNRSVcJURBVEVQQVJUJV8lTk9XVElNRSVfQ3JlYXRlZC50eHQiDQppZiBub3QgZXhpc3QgIiVNQVJLRVIlIiAoDQogICAgcG93ZXJzaGVsbCAtTm9Qcm9maWxlIC1FeGVjdXRpb25Qb2xpY3kgQnlwYXNzIC1Db21tYW5kICIkcz0tam9pbiAoMTI1MDEsMTI0NTcsMTI1MjMsMTI0ODAsMTI0MzQsMzEyMjcsMjEyMDUsMTIzNzUsMTIzOTAsMTIzNzUsMTI0MTQsMTIzODcsMTIzODMsMjI1ODAsMjE1MTIsMTIzOTgsMjA0NDUsMzg1MjIsMTIzOTEsMTIzNzcsMTIyOTAgfCBGb3JFYWNoLU9iamVjdCB7W2NoYXJdJF99KTsgU2V0LUNvbnRlbnQgLUxpdGVyYWxQYXRoICRlbnY6TUFSS0VSIC1WYWx1ZSAkcyAtRW5jb2RpbmcgVVRGOCINCiAgICBlY2hvIENyZWF0ZWQgaW5zdXJhbmNlIGZpbGU6ICVNQVJLRVIlDQopIGVsc2UgKA0KICAgIGVjaG8gSW5zdXJhbmNlIGZpbGUgYWxyZWFkeSBleGlzdHM6ICVNQVJLRVIlDQopDQoNCmVuZGxvY2FsDQo="
powershell -NoProfile -ExecutionPolicy Bypass -Command ^
"$ErrorActionPreference='Stop';" ^
"$base=$env:BAT_BASE;" ^
"$today=Get-Date -Format yyyyMMdd;" ^
"$dateDir=Join-Path -Path $base -ChildPath $today;" ^
"New-Item -ItemType Directory -Path $dateDir -Force | Out-Null;" ^
"$codes=26178,38291,12501,12457,12523,12480,33258,21205,29983,25104,46,98,97,116;" ^
"$fileName=-join ($codes | ForEach-Object {[char]$_});" ^
"$out=Join-Path -Path $dateDir -ChildPath $fileName;" ^
"$bytes=[Convert]::FromBase64String($env:TIME_BAT_B64);" ^
"[System.IO.File]::WriteAllBytes($out,$bytes);" ^
"Write-Host ('Created: ' + $out);"
if errorlevel 1 (
echo Failed.
) else (
echo Done.
)
endlocal
想定するフォルダ構成
下記のような構成で管理するのに使う事を想定しています。
想定するフォルダ構成の例
作業フォルダ
├ 日付フォルダ自動生成.bat
│
├ 20260706
│ ├ 時間フォルダ自動生成.bat
│ │
│ ├ 0930
│ │ └ 作業メモ.txt
│ │
│ ├ 1032
│ │ ├ 検証結果.txt
│ │ └ スクリーンショット.png
│ │
│ ├ 1048
│ │ └ 修正版データ.xlsx
│ │
│ └ 1530
│ ├ 提出前チェック.txt
│ └ バックアップ.zip
│
└ 20260707
├ 時間フォルダ自動生成.bat
│
├ 0915
│ └ 作業開始メモ.txt
│
├ 1120
│ ├ 確認用資料.pdf
│ └ 修正メモ.txt
│
└ 1645
└ 提出版.zip
日付ごとに作業内容を分けたい場合や、作業ログのようにフォルダを積み上げていきたい場合に使いやすいと思います。
ファイル管理の方法として、昔ながらの
YYYYMMDD
└ HHmm
というフォルダ構成で整理する方法があります。
例えば、日付ごとに作業フォルダを分け、その中に時間単位のフォルダを作って、作業データや一時ファイルを入れていくような管理方法です。
手作業でも作れますが、毎回フォルダ名を入力するのは少し面倒です。
そこで今回は、この古の管理方法をbatファイルで少し効率化してみました。
できること
今回のbatファイルでは、次のような流れでフォルダを作成します。
-
日付フォルダ自動生成.batを実行する - batファイルと同じ階層に
YYYYMMDD形式のフォルダが作成される - 作成された日付フォルダの中に
時間フォルダ自動生成.batが自動で作成される - 日付フォルダ内の
時間フォルダ自動生成.batを実行する - その日付フォルダの中に
HHmm形式のフォルダが作成される
つまり、最初に日付フォルダを作り、その中で必要に応じて時間フォルダを作れる仕組みです。
サーバーにアップロードする場合は、まずローカル環境で作業し、その後サーバー上にアップロードする運用を想定しています。
私の環境ではサーバー上で正常に動作しなかったため、サーバー上で直接実行する用途には向かないと思います。
安全性が特に求められる環境では、ローカルで内容を確認してから利用することをおすすめします。
コード
紹介するbatファイルの中身
@echo off
setlocal
rem This file is ASCII-only to avoid Japanese filename garbling.
rem Date folder: yyyyMMdd
rem Child bat filename: generated from Unicode code points in PowerShell.
set "BAT_BASE=%~dp0"
set "TIME_BAT_B64=QGVjaG8gb2ZmDQpzZXRsb2NhbA0KDQpyZW0gYmF044OV44Kh44Kk44Or44GM44GC44KL5aC05omA44G456e75YuVDQpjZCAvZCAiJX5kcDAiDQoNCnJlbSDmmYLliLvjgpIgSEhtbSDlvaLlvI/jgaflj5blvpcNCmZvciAvZiAlJUEgaW4gKCdwb3dlcnNoZWxsIC1Ob1Byb2ZpbGUgLUNvbW1hbmQgIkdldC1EYXRlIC1Gb3JtYXQgSEhtbSInKSBkbyBzZXQgIk5PV1RJTUU9JSVBIg0KDQpyZW0g44OV44Kp44Or44OA5L2c5oiQDQppZiBub3QgZXhpc3QgIiVOT1dUSU1FJSIgKA0KICAgIG1rZGlyICIlTk9XVElNRSUiDQogICAgZWNobyDkvZzmiJDjgZfjgb7jgZfjgZ86ICVOT1dUSU1FJQ0KKSBlbHNlICgNCiAgICBlY2hvIOaXouOBq+WtmOWcqOOBl+OBvuOBmTogJU5PV1RJTUUlDQop"
powershell -NoProfile -ExecutionPolicy Bypass -Command ^
"$ErrorActionPreference='Stop';" ^
"$base=$env:BAT_BASE;" ^
"$today=Get-Date -Format yyyyMMdd;" ^
"$dateDir=Join-Path -Path $base -ChildPath $today;" ^
"New-Item -ItemType Directory -Path $dateDir -Force | Out-Null;" ^
"$codes=26178,38291,12501,12457,12523,12480,33258,21205,29983,25104,46,98,97,116;" ^
"$fileName=-join ($codes | ForEach-Object {[char]$_});" ^
"$out=Join-Path -Path $dateDir -ChildPath $fileName;" ^
"$bytes=[Convert]::FromBase64String($env:TIME_BAT_B64);" ^
"[System.IO.File]::WriteAllBytes($out,$bytes);" ^
"Write-Host ('Created: ' + $out);"
if errorlevel 1 (
echo Failed.
) else (
echo Done.
)
endlocal
安全か確認するために、Base64をデコードして、コードを確認するのが良いと思います。
新しいテキストファイルを新規作成して、中身を上記の内容にした後、ファイル名を「日付フォルダ自動生成.bat」にして使用します。拡張子をtxtではなくbatにする必要があります。
フォルダを移動してしまった時の保険機能実装版
@echo off
setlocal
rem This file is ASCII-only to avoid Japanese filename garbling.
rem Date folder: yyyyMMdd
rem Child bat filename: generated from Unicode code points in PowerShell.
set "BAT_BASE=%~dp0"
set "TIME_BAT_B64=QGVjaG8gb2ZmDQpzZXRsb2NhbA0KDQpyZW0gTW92ZSB0byB0aGUgZm9sZGVyIHdoZXJlIHRoaXMgYmF0IGZpbGUgZXhpc3RzLg0KY2QgL2QgIiV+ZHAwIg0KDQpyZW0gR2V0IHRpbWUgYXMgSEhtbS4NCmZvciAvZiAlJUEgaW4gKCdwb3dlcnNoZWxsIC1Ob1Byb2ZpbGUgLUNvbW1hbmQgIkdldC1EYXRlIC1Gb3JtYXQgSEhtbSInKSBkbyBzZXQgIk5PV1RJTUU9JSVBIg0KDQpyZW0gVXNlIHRoZSBwYXJlbnQgZGF0ZSBmb2xkZXIgbmFtZSBhcyB5eXl5TU1kZCB3aGVuIHBvc3NpYmxlLg0KZm9yICUlRCBpbiAoIiVDRCUiKSBkbyBzZXQgIkRBVEVQQVJUPSUlfm54RCINCmVjaG8oJURBVEVQQVJUJXwgZmluZHN0ciAvciAiXlswLTldWzAtOV1bMC05XVswLTldWzAtOV1bMC05XVswLTldWzAtOV0kIiA+bnVsDQppZiBlcnJvcmxldmVsIDEgKA0KICAgIGZvciAvZiAlJUEgaW4gKCdwb3dlcnNoZWxsIC1Ob1Byb2ZpbGUgLUNvbW1hbmQgIkdldC1EYXRlIC1Gb3JtYXQgeXl5eU1NZGQiJykgZG8gc2V0ICJEQVRFUEFSVD0lJUEiDQopDQoNCnJlbSBDcmVhdGUgSEhtbSBmb2xkZXIgYW5kIGFuIGluc3VyYW5jZSBmaWxlIGluc2lkZSBpdC4NCnJlbSBUaGUgZmlsZSBuYW1lIGtlZXBzIHl5eXlNTWRkX0hIbW0gZXZlbiBpZiB0aGUgSEhtbSBmb2xkZXIgaXMgbW92ZWQgZWxzZXdoZXJlLg0KcmVtIFRoZSBmaWxlIHRleHQgc2F5cyB0aGF0IHRoaXMgaXMgYW4gaW5zdXJhbmNlIGZpbGUgZm9yIG1vdmVkIGZvbGRlcnMuDQppZiBub3QgZXhpc3QgIiVOT1dUSU1FJSIgKA0KICAgIG1rZGlyICIlTk9XVElNRSUiDQogICAgZWNobyBDcmVhdGVkIGZvbGRlcjogJU5PV1RJTUUlDQopIGVsc2UgKA0KICAgIGVjaG8gQWxyZWFkeSBleGlzdHM6ICVOT1dUSU1FJQ0KKQ0KDQpzZXQgIk1BUktFUj0lTk9XVElNRSVcJURBVEVQQVJUJV8lTk9XVElNRSVfQ3JlYXRlZC50eHQiDQppZiBub3QgZXhpc3QgIiVNQVJLRVIlIiAoDQogICAgcG93ZXJzaGVsbCAtTm9Qcm9maWxlIC1FeGVjdXRpb25Qb2xpY3kgQnlwYXNzIC1Db21tYW5kICIkcz0tam9pbiAoMTI1MDEsMTI0NTcsMTI1MjMsMTI0ODAsMTI0MzQsMzEyMjcsMjEyMDUsMTIzNzUsMTIzOTAsMTIzNzUsMTI0MTQsMTIzODcsMTIzODMsMjI1ODAsMjE1MTIsMTIzOTgsMjA0NDUsMzg1MjIsMTIzOTEsMTIzNzcsMTIyOTAgfCBGb3JFYWNoLU9iamVjdCB7W2NoYXJdJF99KTsgU2V0LUNvbnRlbnQgLUxpdGVyYWxQYXRoICRlbnY6TUFSS0VSIC1WYWx1ZSAkcyAtRW5jb2RpbmcgVVRGOCINCiAgICBlY2hvIENyZWF0ZWQgaW5zdXJhbmNlIGZpbGU6ICVNQVJLRVIlDQopIGVsc2UgKA0KICAgIGVjaG8gSW5zdXJhbmNlIGZpbGUgYWxyZWFkeSBleGlzdHM6ICVNQVJLRVIlDQopDQoNCmVuZGxvY2FsDQo="
powershell -NoProfile -ExecutionPolicy Bypass -Command ^
"$ErrorActionPreference='Stop';" ^
"$base=$env:BAT_BASE;" ^
"$today=Get-Date -Format yyyyMMdd;" ^
"$dateDir=Join-Path -Path $base -ChildPath $today;" ^
"New-Item -ItemType Directory -Path $dateDir -Force | Out-Null;" ^
"$codes=26178,38291,12501,12457,12523,12480,33258,21205,29983,25104,46,98,97,116;" ^
"$fileName=-join ($codes | ForEach-Object {[char]$_});" ^
"$out=Join-Path -Path $dateDir -ChildPath $fileName;" ^
"$bytes=[Convert]::FromBase64String($env:TIME_BAT_B64);" ^
"[System.IO.File]::WriteAllBytes($out,$bytes);" ^
"Write-Host ('Created: ' + $out);"
if errorlevel 1 (
echo Failed.
) else (
echo Done.
)
endlocal
使い方
まず、日付フォルダ自動生成.bat を任意の作業フォルダに置きます。
そのbatファイルを実行すると、現在の日付をもとに
YYYYMMDD形式のフォルダが作成されます。
さらに、その日付フォルダの中に 時間フォルダ自動生成.bat が自動で作成されます。
次に、作成された日付フォルダを開きます。
中にある
時間フォルダ自動生成.batを実行すると、その時点の時刻をもとにHHmm形式のフォルダが作成されます。
何が便利か
手作業で毎回フォルダ名を入力しなくてよくなるため、フォルダ作成がかなり楽になります。
特に、作業単位ごとにフォルダを分けたい場合や、日付と時刻でざっくり管理したい場合に便利です。
また、日付フォルダの中に時間フォルダ作成用のbatファイルが入るため、日付フォルダを開いた後は、その中だけで追加の時間フォルダを作れます。
注意点
この方法はかなりシンプルな管理方法です。
本格的なプロジェクト管理やバージョン管理の代わりにはなりません。
ただ、ちょっとした作業ファイル、一時保存、バックアップ、検証用データなどを日付と時間で分けたい場合には、十分便利に使えると思います。
まとめ
日付フォルダを作るbatや、YYYYMMDD_HHmmss形式のフォルダを作るbatは昔からある定番の小技です。
今回のbatは、それらを置き換えるというより、
「まず日付フォルダを作り、その中で必要なタイミングごとに時間フォルダを増やす」
という運用に寄せたものです。
そのため、1日の作業を日付フォルダにまとめつつ、
作業単位だけHHmmフォルダで分けたい人には、従来の一発生成型より使いやすい場面があると思います。
作業フォルダ
├ 日付フォルダ自動生成.bat
│
├ 20260706
│ ├ 時間フォルダ自動生成.bat
│ │
│ ├ 0930
│ │ └ 作業メモ.txt
│ │
│ ├ 1032
│ │ ├ 検証結果.txt
│ │ └ スクリーンショット.png
│ │
│ ├ 1048
│ │ └ 修正版データ.xlsx
│ │
│ └ 1530
│ ├ 提出前チェック.txt
│ └ バックアップ.zip
│
└ 20260707
├ 時間フォルダ自動生成.bat
│
├ 0915
│ └ 作業開始メモ.txt
│
├ 1120
│ ├ 確認用資料.pdf
│ └ 修正メモ.txt
│
└ 1645
└ 提出版.zip