【bat】バッチファイルでフォルダを作成する方法完全ガイド|mkdir・存在確認・階層一括・日付フォルダ・エラー処理・実践パターンまで徹底解説

バッチファイルでフォルダを作成するには mkdir(または md)コマンドを使います。単純な1フォルダの作成から、階層フォルダの一括作成・存在確認してから作成・日付フォルダの自動生成・プロジェクト構成の丸ごと初期化まで、実務で使えるパターンを体系的に解説します。

この記事でわかること

  • mkdir / md の基本構文とオプション
  • if not exist で存在確認してから作成する方法
  • 階層フォルダ(a\b\c)を中間ディレクトリごと一括作成する方法
  • 複数フォルダをスペース区切りで一度に作成する方法
  • 日付・日時フォルダを自動生成する方法
  • %~dp0 を使ってバッチの場所にフォルダを作成するパターン
  • mkdir のエラー処理(errorlevel の意味と対処)
  • 実践例3本(プロジェクト構成初期化・日付ログ管理・拡張子別仕分け)
スポンサーリンク

1. mkdir コマンドの基本構文とオプション

mkdir フォルダパス
:: 短縮形(まったく同じ動作)
md フォルダパス
コマンド例 作成結果 備考
mkdir work カレントに work フォルダを作成 相対パス
mkdir "C:\tools\logs" C:\tools\logs を作成 絶対パス・ダブルクォートで囲む
mkdir "C:\a\b\c" abc を一気に作成 中間ディレクトリも自動作成
mkdir work output logs workoutputlogs を一括作成 スペース区切りで複数指定
@echo off

:: 基本形:指定したパスにフォルダを作成
mkdir "C:\work\project"

:: md は mkdir の別名(まったく同じ)
md "C:\work\project"

:: 相対パスも使える(カレントディレクトリ基準)
mkdir output
mkdir logs\archive
mkdir は中間ディレクトリを自動作成する
mkdir "C:\a\b\c" を実行すると、abc がすべて存在しなくても一度に作成されます。Linux の mkdir -p と同じ動作です。中間ディレクトリを事前に作る必要はありません。

2. フォルダが存在しない場合のみ作成する(if not exist)

既にフォルダが存在する状態で mkdir を実行すると「サブディレクトリまたはファイルが既に存在します。」というエラーが表示されます(エラーレベルは 1)。if not exist で事前にチェックするのが実務の定石です。

@echo off
setlocal

set TARGET=C:\work\output

:: パス末尾に \ を付けるとフォルダのみを判定(ファイルとの混同を防ぐ)
if not exist "%TARGET%\" (
    mkdir "%TARGET%"
    echo [OK] フォルダを作成しました: %TARGET%
) else (
    echo [INFO] フォルダは既に存在します: %TARGET%
)
パス末尾の \ でフォルダのみを判定
if not exist "%PATH%" はファイルとフォルダの両方にマッチしますが、if not exist "%PATH%\"(末尾に \)にするとフォルダのみを判定します。同名のファイルが存在する場合の誤検知を防げます。存在確認の詳細は IF EXISTでファイル・フォルダの存在確認をする方法 も参照してください。

「存在しない場合のみ作成」のパターンについては バッチファイルでフォルダが存在しない場合のみ作成する方法 も参照してください。

3. 階層フォルダを一括作成する

3-1. ネストしたパスをまとめて作成する

@echo off

:: 3階層まとめて作成(a が存在しなくても b・c も一緒に作られる)
mkdir "C:\project\src\components"
mkdir "C:\project\src\utils"
mkdir "C:\project\dist\js"
mkdir "C:\project\dist\css"
mkdir "C:\project\logs\archive"

echo プロジェクト構成を作成しました

3-2. for ループで大量のフォルダを一括作成する

@echo off
setlocal

set BASE=C:\project

:: 作成するフォルダの一覧
for %%D in (
    src\components
    src\utils
    src\services
    dist\js
    dist\css
    dist\images
    logs\archive
    docs
) do (
    if not exist "%BASE%\%%D\" (
        mkdir "%BASE%\%%D"
        echo [OK] %BASE%\%%D
    ) else (
        echo [SKIP] 既存: %BASE%\%%D
    )
)

echo フォルダ構成の作成が完了しました

4. 複数フォルダをスペース区切りで一度に作成する

mkdir はスペース区切りで複数のフォルダ名を一度に指定できます。スペースを含まないフォルダ名であればそのまま列挙するだけです。

@echo off

:: スペース区切りで3フォルダを一括作成
mkdir work output logs

:: スペースを含む名前はダブルクォートで囲む(1フォルダずつ)
mkdir "My Project" "Test Output" "Log Files"
複数指定でスペース入りフォルダ名は誤解釈される
mkdir "folder a" "folder b" のようにダブルクォートで囲んだ複数指定はWindows CMD では正しく動作しないことがあります。スペースを含む名前のフォルダを複数作成する場合は1行ずつ書く方が確実です。

5. 日付・日時フォルダを自動生成する方法

バックアップ・ログ管理などで日付入りフォルダを自動的に作成する方法です。%DATE%%TIME% の文字列操作で日付・時刻を取得できます。

@echo off
setlocal

:: 日付フォルダ(例: 20250317)
set TODAY=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%
mkdir "C:\logs\%TODAY%"
echo 作成: C:\logs\%TODAY%

:: 年/月/日の3階層構造
set YEAR=%DATE:~0,4%
set MONTH=%DATE:~5,2%
set DAY=%DATE:~8,2%
mkdir "C:\logs\%YEAR%\%MONTH%\%DAY%"
echo 作成: C:\logs\%YEAR%\%MONTH%\%DAY%

:: 日時フォルダ(例: 20250317_143022)
set HOUR=%TIME:~0,2%
set MIN=%TIME:~3,2%
set SEC=%TIME:~6,2%
:: 時刻が1桁(午前)の場合は先頭スペースを 0 に置換
set HOUR=%HOUR: =0%
set DATETIME=%TODAY%_%HOUR%%MIN%%SEC%
mkdir "C:\backup\%DATETIME%"
echo 作成: C:\backup\%DATETIME%
%DATE% の形式は地域設定に依存する
上記のコードは %DATE%2025/03/17(日本語Windows標準)の形式を前提にしています。他の形式(Mon 03/17/2025 等)の環境では文字位置が変わります。環境を問わず安定させるには wmic os get LocalDateTime または PowerShell の Get-Date -Format "yyyyMMdd" を使うと確実です。
@echo off

:: PowerShell を使えば %DATE% の形式に依存しない(推奨)
for /f %%D in ('powershell -Command "Get-Date -Format yyyyMMdd"') do set TODAY=%%D
mkdir "C:\logs\%TODAY%"
echo 作成: C:\logs\%TODAY%

6. %~dp0 を使ってバッチの場所にフォルダを作成する

%~dp0(バッチファイル自身のディレクトリ)を使えば、バッチをどこから実行してもバッチファイルと同じ場所にフォルダを作成できます。ツール配布時に構成を自動展開するのに便利です。

@echo off
setlocal

:: バッチと同じ場所に output・logs フォルダを作成
for %%D in ("output" "logs" "temp") do (
    if not exist "%~dp0%%~D\" (
        mkdir "%~dp0%%~D"
        echo [OK] 作成: %~dp0%%~D
    )
)
echo 初期フォルダ構成が完成しました

%~dp0 の詳細な使い方は %~dp0 完全ガイド|バッチファイルの場所を基準にファイル操作する方法 も参照してください。

7. mkdir のエラー処理(errorlevel の確認)

mkdir は成功時に 0、失敗時に 1 を返します。失敗原因には「既にフォルダが存在する」「アクセス権がない」「パスが不正」などがあります。

@echo off
setlocal

set NEW_DIR=C:\work\output

mkdir "%NEW_DIR%"
if %errorlevel% equ 0 (
    echo [OK] 作成しました: %NEW_DIR%
) else (
    :: 既存フォルダのエラーか、権限エラーかを判定
    if exist "%NEW_DIR%\" (
        echo [INFO] フォルダは既に存在しています: %NEW_DIR%
    ) else (
        echo [ERROR] フォルダの作成に失敗しました: %NEW_DIR%
        echo         パスが正しいか、権限があるか確認してください
        exit /b 1
    )
)
errorlevel 意味 対処
0 作成成功 そのまま処理を続ける
1 + フォルダが存在 すでに存在するためエラー INFO として処理継続(if exist で確認)
1 + フォルダが不在 権限不足・パスが不正 エラーログを出して終了

7-1. エラーメッセージを非表示にして存在確認で代用する(推奨パターン)

@echo off
setlocal

set TARGET=C:\work\output

:: 推奨: if not exist で確認してから作成(エラーメッセージが出ない)
if not exist "%TARGET%\" (
    mkdir "%TARGET%"
    if %errorlevel% neq 0 (
        echo [ERROR] 作成失敗(権限不足の可能性): %TARGET%
        exit /b 1
    )
    echo [OK] 作成: %TARGET%
) else (
    echo [SKIP] 既存のため作成スキップ: %TARGET%
)

8. 実践例3本

実践例1:プロジェクトのフォルダ構成を丸ごと初期化する

新しいプロジェクトを始めるとき、init.bat を1回実行するだけで必要なフォルダ構成をすべて作成するスクリプトです。

@echo off
setlocal

:: プロジェクトのルートをバッチの場所に設定
set ROOT=%~dp0

:: 作成するフォルダ構成
set DIRS=^
    src ^
    src\components ^
    src\utils ^
    dist ^
    dist\js ^
    dist\css ^
    dist\images ^
    logs ^
    logs\archive ^
    docs ^
    test

echo === プロジェクト構成を初期化します ===
set CREATED=0
set SKIPPED=0

for %%D in (%DIRS%) do (
    if not exist "%ROOT%%%D\" (
        mkdir "%ROOT%%%D"
        echo [OK] 作成: %%D
        set /a CREATED+=1
    ) else (
        echo [SKIP] 既存: %%D
        set /a SKIPPED+=1
    )
)

echo ===================================
echo 作成: %CREATED% 件  スキップ: %SKIPPED% 件
echo プロジェクト構成の初期化が完了しました

実践例2:日付別ログフォルダを自動作成してログを格納する

タスクスケジューラで毎日実行するバッチで、日付別のフォルダを自動作成してログを保存します。

@echo off
setlocal

:: 今日の日付フォルダを作成(PowerShell で地域設定に依存しない形式を取得)
for /f %%D in ('powershell -Command "Get-Date -Format yyyyMMdd"') do set TODAY=%%D

set LOG_ROOT=%~dp0logs
set LOG_DIR=%LOG_ROOT%\%TODAY%
set LOG_FILE=%LOG_DIR%\process.log

:: 日付フォルダがなければ作成
if not exist "%LOG_DIR%\" (
    mkdir "%LOG_DIR%"
    echo [%DATE% %TIME%] ログフォルダを作成しました: %LOG_DIR% >> "%LOG_FILE%"
)

:: 処理開始ログ
echo [%DATE% %TIME%] 処理開始 >> "%LOG_FILE%"

:: ... メイン処理 ...
echo [%DATE% %TIME%] 処理完了 >> "%LOG_FILE%"

:: 30日以上前のログフォルダを削除(世代管理)
forfiles /P "%LOG_ROOT%" /D -30 /C "cmd /c if @isdir==TRUE rd /S /Q @path" 2>nul

echo 完了。ログ: %LOG_FILE%

実践例3:ファイルを拡張子別フォルダに仕分けるための構成を自動作成する

ダウンロードフォルダや作業フォルダにたまったファイルを拡張子ごとに整理するためのフォルダ構成を自動作成し、ファイルを移動します。

@echo off
setlocal enabledelayedexpansion

set SOURCE=C:\Users\%USERNAME%\Downloads
set DEST=C:\Users\%USERNAME%\Documents\Sorted

:: 仕分け先フォルダの定義(拡張子=フォルダ名)
set EXT_MAP=pdf=PDF xlsx=Excel docx=Word jpg=Images png=Images mp4=Videos zip=Archives

:: まず仕分け先フォルダをすべて作成
for %%P in (%EXT_MAP%) do (
    for /f "tokens=2 delims==" %%V in ("%%P") do (
        if not exist "%DEST%\%%V\" (
            mkdir "%DEST%\%%V"
            echo [OK] 作成: %DEST%\%%V
        )
    )
)

:: ファイルを拡張子で仕分け(dir /b でスペース入りパスにも対応)
set MOVED=0
for /f "usebackq delims=" %%F in (`dir /b "%SOURCE%\*.*" 2^>nul`) do (
    set EXT=%%~xF
    set EXT=!EXT:~1!
    :: PDF
    if /i "!EXT!"=="pdf"  ( move "%SOURCE%\%%F" "%DEST%\PDF\" >nul & set /a MOVED+=1 )
    :: Excel
    if /i "!EXT!"=="xlsx" ( move "%SOURCE%\%%F" "%DEST%\Excel\" >nul & set /a MOVED+=1 )
    :: Word
    if /i "!EXT!"=="docx" ( move "%SOURCE%\%%F" "%DEST%\Word\" >nul & set /a MOVED+=1 )
    :: 画像
    if /i "!EXT!"=="jpg"  ( move "%SOURCE%\%%F" "%DEST%\Images\" >nul & set /a MOVED+=1 )
    if /i "!EXT!"=="png"  ( move "%SOURCE%\%%F" "%DEST%\Images\" >nul & set /a MOVED+=1 )
    :: 動画
    if /i "!EXT!"=="mp4"  ( move "%SOURCE%\%%F" "%DEST%\Videos\" >nul & set /a MOVED+=1 )
    :: 圧縮
    if /i "!EXT!"=="zip"  ( move "%SOURCE%\%%F" "%DEST%\Archives\" >nul & set /a MOVED+=1 )
)

echo !MOVED! 件のファイルを仕分けしました

9. まとめ:mkdir チートシート

やりたいこと コード例 ポイント
1フォルダを作成 mkdir "パス" 中間ディレクトリも自動作成
存在しない場合のみ作成 if not exist "パス\" mkdir "パス" 末尾 \ でフォルダのみ判定
複数フォルダを一括作成 mkdir work output logs スペース区切り(スペースなし名前のみ)
for ループで一括作成 for %%D in (list) do mkdir "%ROOT%\%%D" if not exist と組み合わせる
日付フォルダを作成 for /f %%D in ('PowerShell...') do mkdir "logs\%%D" PowerShell で地域設定非依存
バッチの場所に作成 mkdir "%~dp0フォルダ名" 実行場所に依存しない
作成失敗を検出 if %errorlevel% neq 0if exist で原因判定 既存か権限エラーかを区別

フォルダの削除については バッチファイルでフォルダを削除する方法完全ガイド、フォルダのコピーについては バッチファイルでフォルダをコピーする方法完全ガイド も参照してください。

FAQ

Qmkdir と md の違いは何ですか?

Amkdirmd はまったく同じコマンドの別名です。動作・オプション・挙動はすべて同一です。一般的に可読性を重視する場合は mkdir、短く書きたい場合は md を使います。

Qすでに存在するフォルダに mkdir を実行するとどうなりますか?

A「サブディレクトリまたはファイルが既に存在します。」というメッセージが表示され、errorlevel が 1 になります。ただしフォルダ自体は削除されず、中のファイルも影響を受けません。事前に if not exist "フォルダ\" で確認するか、エラーを 2>nul で抑制してif exist で判定する方法があります。

Q階層(サブフォルダ)を一気に作成できますか?

Aはい。mkdir "C:\a\b\c" のように深いパスを指定すると、存在しない中間ディレクトリも含めてすべて自動作成されます。Linux の mkdir -p と同じ動作です。

Qフォルダ名にスペースが含まれる場合はどうすればよいですか?

Amkdir "My Folder" のようにダブルクォートで囲んでください。ダブルクォートなしで mkdir My Folder と書くと MyFolder の2つのフォルダが作成されてしまいます。

Qmkdir が「アクセスが拒否されました」で失敗します。

A主な原因は2つです。①管理者権限が必要な場所(C:\Program Files\ など)への作成 → 管理者として実行してください。②ネットワークドライブや読み取り専用パスへの作成 → 書き込み権限があるパスを使ってください。

QPowerShell を使ってフォルダを作成する方法は?

Aバッチから呼び出す場合は powershell -Command "New-Item -ItemType Directory -Path 'パス' -Force" を使います。-Force オプションを付けると、フォルダが既に存在していてもエラーにならずに処理を続けられます。バッチの if not exist + mkdir と同じ効果を1コマンドで実現できます。