検証環境

  • Windows 10 Pro 64bit (22H2)
  • Windows 11 Pro (23H2)
  • Windows 11 Pro (24H2) ※2026/1/20追記

バッチファイル(.bat)の書き方サンプル

よく書き方を忘れるので、自分が良く使うバッチファイルの書き方をここにメモっておく

コマンド丸見え防ぐ&カレントディレクトリをBATと同じ場所に

だいたいのバッチファイルの頭に付けとけば良いと思います

コマンドが丸見えになるのを防ぐ「@echo off」
カレントディレクトリをバッチファイルと同じ場所にする「cd /d %~dp0」

@echo off
cd /d %~dp0

一時停止

コマンドの実行を停止します、何かキーを押すと進みます

pause

画面に文字を表示

「@echo off」でコマンドを非表示にしていても
「ECHO」コマンドで指定した文字列は表示されます
下記であれば「ねこ大好き」と表示されます

@echo off

ECHO ねこ大好き

バッチファイルの実行を終了する

バッチファイルの実行をここで終了します
通常のgotoだと飛び先として同じ名前のラベルの配置が必要ですが、これはラベルが不要です

goto :eof

バッチファイルにドラッグ&ドロップした複数ファイル処理ループ

このバッチファイルにファイルをドラッグ&ドロップすると、そのファイルの数だけループが回ります
以下の例ではループ内の「echo %%q」により複数のフルパスファイル名が並んで表示されます
「%%q」変数にフルパスファイル名が入ります
ファイル名・フォルダー名に半角スペースが含まれている場合は「"」で囲われ、引数取得で分割される事を防ぎます

@echo off
cd /d %~dp0

for %%q in (%*) do (
  echo %%q
)

pause

⚠️ファイル名・フォルダー名に全角スペースが含まれ、半角スペースが含まれない場合は「"」で囲われないため、引数取得で全角スペースの所で分割し、上手く動きません(バッチファイルの仕様です)
対処はなかなか難しいため【ファイル名には全角スペースを入れない】様にしましょう

半角スペースなし・全角スペースなし

D:\Test\file_a\file1.txt
D:\Test\file_a\file2.txt
D:\Test\file_a\file3.txt
D:\Test\file_a\file1.txt
D:\Test\file_a\file2.txt
D:\Test\file_a\file3.txt

半角スペースあり・全角スペースなし

D:\Test\file_b\file 1.txt
D:\Test\file_b\file 2.txt
D:\Test\file_b\file 3.txt
"D:\Test\file_b\file 1.txt"
"D:\Test\file_b\file 2.txt"
"D:\Test\file_b\file 3.txt"

半角スペースなし・全角スペースあり

⚠️バラバラになってしまう(バッチファイルの仕様)

D:\Test\file_c\file 1.txt
D:\Test\file_c\file 2.txt
D:\Test\file_c\file 3.txt
D:\Test\file_c\file
1.txt
D:\Test\file_c\file
2.txt
D:\Test\file_c\file
3.txt

半角スペースあり・全角スペースあり

全角スペースがあるものの、半角スペースがあるおかげで「"」で囲われバラバラにならずに済む

D:\Test\file_d\fi le 1.txt
D:\Test\file_d\fi le 2.txt
D:\Test\file_d\fi le 3.txt
"D:\Test\file_d\fi le 1.txt"
"D:\Test\file_d\fi le 2.txt"
"D:\Test\file_d\fi le 3.txt"

管理者権限で実行しているかチェック

バッチファイルが管理者権限で実行されてるかどうかをチェックします
管理者権限が必要なバッチファイルの頭に付けると良いでしょう

@echo off
cd /d %~dp0

for /f "tokens=1 delims=," %%i in ('whoami /groups /FO CSV /NH') do (
  if "%%~i"=="BUILTIN\Administrators" set ADMIN=yes
  if "%%~i"=="Mandatory Label\High Mandatory Level" set ELEVATED=yes
)

if "%ADMIN%" neq "yes" (
  echo 管理者権限で実行されていません
  echo バッチファイルの実行を停止します
  pause
  goto :eof
)
if "%ELEVATED%" neq "yes" (
  echo 管理者権限で実行されていません
  echo バッチファイルの実行を停止します
  pause
  goto :eof
)

echo 管理者権限で実行されています

pause