毎日手動で「20260429」のようなフォルダを作っていませんか?
バッチファイル1つで、その作業は0秒になります。
しかし、ネットにあるコードをそのまま使うと、1桁の月(1月〜9月)の時にエラーが出て動かないことがあります。この記事では、そんな「空白問題」を対策済みの、現場でそのまま使える決定版コードを現役エンジニアの筆者が紹介します。
windowsのプロンプトで使用できるbatやpythonやphpを使用して、業務効率化やWebサイトを作成しております。javaやシェルスクリプトなど、様々なプログラミングを行った実績ありの筆者です。
午前9時にエラーが出る人へ初心者でも失敗しない「0埋め(1桁の月日対策)」済みのコードを紹介します。
【結論】batで日付フォルダを作る今すぐ使える魔法のコード
@echo off
set DT=%date:/=%
set DT=%DT: =0%
set YMD=%DT:~0,8%
mkdir %YMD%- 実行した瞬間に「20260429」という形式のフォルダを作成します。
- 1桁の月日でもエラーになりません(ここが重要!)。
なぜこの書き方なのか?(技術解説)
そのままフォルダを作ろうとすると、「スペースのせいでフォルダ名が途切れる」「エラーで止まる」という現象が起きます。
そのまま切り出すと、フォルダ名に勝手にスペースが混じり、コマンドが途中で切れてエラーになります。
set DT=%DT: =0% :この一行が、厄介な「空白」をすべて「0」に置き換えてくれます。これで、1月でも10月でも安定して動くようになります。
%date% の正体
コマンドプロンプトで echo %date% と打つと、多くの場合以下のような結果が返ってきます。
2026/04/29
しかし、この中身はPCの設定によって以下のように変化します:
2026/04/29(標準的な日本の設定)2026/04/29 水(曜日が含まれる設定)Wed 04/29/2026(英語圏の設定)
つまり、「1文字目から4文字目が年」という前提が崩れる可能性があるのが、バッチファイル作成における最大の注意点です。
文字列の「切り出し」の仕組み
バッチファイルでは、%date:~開始位置,文字数% という特殊な書き方で、文字列の特定の部分だけを抽出します。
日本の標準設定(YYYY/MM/DD)の場合のインデックス
文字の位置を 0から数える のがポイントです。
| 文字 | 2 | 0 | 2 | 6 | / | 0 | 4 | / | 2 | 9 |
| 位置 | 0 | 1 | 2 |
年 (YYYY): %date:~0,4% (0番目から4文字) → 2026
月 (MM): %date:~5,2% (5番目から2文字) → 04
日 (DD): %date:~8,2% (8番目から2文字) → 29
これを組み合わせて set YMD=%date:~0,4%%date:~5,2%%date:~8,2% と書くことで、スラッシュを取り除いた 20260429 という文字列が作れます。
なぜ「置換」が必要なのか?
前述の構成案で set DT=%date:/=% という処理を入れましたが、これには重要な理由があります。
スラッシュ / を消去する理由
mkdir コマンドでフォルダを作る際、名前に /(スラッシュ)が含まれていると、Windowsはそれを「フォルダの区切り」と認識してしまいます。
mkdir 2026/04/29と実行すると、「2026」というフォルダの中に「04」フォルダ、その中に「29」フォルダを作ろうとしてしまいます。
空白を「0」に置換する理由
これが最も厄介な点です。環境によっては、1桁の月が 4(スペース+4)のように、10の位が空白になることがあります。
set DT=%DT: =0% と書くことで、「もし空白があったら0に置き換える」という処理を行い、常に 04 という2桁の状態を保てるようにしています。
【実務応用】さらに便利なカスタマイズ
日付だけじゃなくて、時間も含める
「日付だけじゃなくて、時間も入れたい」「特定の場所に入れたい」という方向けのカスタマイズ集です。
バックアップを1日に何度も取る場合に便利です。
set TM=%time::=%
set TM=%TM: =0%
mkdir %YMD%_%TM:~0,6%結果:20260429_101530 のようなフォルダができます。
日付と同じように、時刻も %time% という変数で取得できます。しかし、そのままフォルダ名に使おうとすると100%エラーになります。
「:(コロン)」と「.(ドット)」が含まれている: Windowsのフォルダ名には、コロンを使うことができません。
午前中の「空白」問題: 実は、午前9時などの1桁の時間帯は 9:15:30 のように先頭に半角スペースが入ります。これが原因でバッチが動かないケースが非常に多いのです。
【決定版】日付+時刻のフォルダ作成コード
このコードは、不要な記号を取り除き、さらに「午前中の空白」を「0」に置き換える対策を施した、最も安全な書き方です。
@echo off
:: 1. 日付の取得と整形(/ を取り除く)
set DT=%date:/=%
set DT=%DT: =0%
set YMD=%DT:~0,8%
:: 2. 時刻の取得と整形(: と . を取り除き、空白を0に置換)
set TM=%time::=%
set TM=%TM:.=%
set TM=%TM: =0%
:: 3. フォルダ名の作成(YYYYMMDD_HHMMSS)
:: ※ミリ秒まで入れると長いため、頭から6文字(時分秒)を切り出し
set TARGET_NAME=%YMD%_%TM:~0,6%
:: 4. フォルダ作成
mkdir %TARGET_NAME%
echo フォルダ「%TARGET_NAME%」を作成しました。
pauseコード解説
① 時刻から記号を消す (%time::=%, %time:.=%)
バッチファイルには「特定の文字を消す(置換する)」機能があります。
%time::=%:すべての:を空文字に置き換えます。%time:.=%:すべての.を空文字に置き換えます。 これで、10:15:30.45が10153045というただの数字の羅列になります。
② 魔の「午前9時問題」を解決する (set TM=%TM: =0%)
ここがプロのこだわりポイントです。 午前9時に実行した場合、標準では 91530 となり、先頭にスペースが残ります。このまま mkdir を使うと、「コマンドの区切り」と誤認されてエラーになります。 この一行を入れることで、091530 となり、常に安定したフォルダ名になります。
③ 必要な部分だけ切り出す (%TM:~0,6%)
時刻変数はミリ秒まで含まれていて少し長すぎるため、最初の6文字(時・分・秒)だけを切り出しています。
実務での活用例
ログファイルの整理: 実行するたびに新しいフォルダを作って、そこに実行結果を保存する。
上書き禁止のバックアップ: 日付だけのフォルダだと、1日に2回実行したときに上書きされてしまいます。時刻まで含めれば「20260429_101530」「20260429_143000」のように別々に保存できます。
特定のディレクトリに作成する
デスクトップや共有サーバーに直接作りたい場合です。
mkdir "C:\Users\YourName\Desktop\Backup_%YMD%"まとめ
プロの現場では、ログ保存のためにこのコードを必ず忍ばせています
日付取得はバッチファイル自動化の第一歩。
一度作っておけば、将来的にログ管理やバックアップにも応用可能です。