バッチファイルで「値を保存して後で使う」には変数が欠かせません。set コマンドの使い方・環境変数の読み書き・計算・ユーザー入力・遅延展開まで、変数に関するすべてを解説します。
setコマンドの基本:変数の定義と参照
変数に値を代入するには set 変数名=値 と書きます。変数を使うときは %変数名% のようにパーセント記号で囲みます。
@echo off
rem 変数の定義(=の前後にスペースを入れない!スペースも値になる)
set NAME=Taro
set FOLDER=C:\work
rem 変数の参照(%変数名%で囲む)
echo 名前: %NAME%
echo フォルダ: %FOLDER%
rem 変数同士を組み合わせる
set BACKUP=%FOLDER%\backup
echo バックアップ先: %BACKUP%
rem 変数を削除(=の後に何も書かない)
set NAME=
echo 削除後: %NAME% ← 空になるよくある失敗:set NAME = Taro のように = の前後にスペースを入れると、変数名に「NAME 」(スペース付き)が設定されてしまい、%NAME% で参照できなくなります。必ず set NAME=Taro と書きましょう。
set /a ― 数値計算をする
set /a(/aはArithmeticの略)を使うと変数で数値計算ができます。通常の set は文字列しか扱えませんが、set /a は整数の四則演算に対応しています。
@echo off
set /a RESULT=10+5
echo 10+5 = %RESULT% ← 15
set /a RESULT=100/4
echo 100/4 = %RESULT% ← 25(小数点以下は切り捨て)
set /a RESULT=10%%3
echo 10%%3 = %RESULT% ← 1(余り。%%と書く点に注意)
set /a RESULT=2*8
echo 2*8 = %RESULT% ← 16
rem カウンターとして使う(+= で加算)
set COUNT=0
set /a COUNT+=1
set /a COUNT+=1
echo カウント: %COUNT% ← 2set /p ― ユーザーにキーボード入力を求める
set /p(/pはPromptの略)を使うと、ユーザーにキーボード入力を促すことができます。入力された値が変数に格納されます。
@echo off
set /p USERNAME=お名前を入力してください:
echo こんにちは、%USERNAME%さん!
rem 処理の実行前に確認を求める
set /p ANSWER=本当に実行しますか? (y/n):
if /i "%ANSWER%"=="y" (
echo 処理を実行します
) else (
echo キャンセルしました
)主要な環境変数一覧
環境変数とはWindowsがあらかじめ用意している変数です。set で定義しなくても最初から使えます。
| 環境変数 | 内容 | 例 |
|---|---|---|
| %USERNAME% | 現在ログイン中のユーザー名 | Taro |
| %COMPUTERNAME% | コンピューター名 | MY-PC |
| %USERPROFILE% | ユーザーのホームフォルダ | C:\Users\Taro |
| %APPDATA% | アプリデータフォルダ | C:\Users\Taro\AppData\Roaming |
| %TEMP% / %TMP% | 一時ファイルフォルダ | C:\Users\Taro\AppData\Local\Temp |
| %WINDIR% | Windowsインストールフォルダ | C:\Windows |
| %SYSTEMROOT% | システムルートフォルダ(WINDIRと同じ) | C:\Windows |
| %DATE% | 今日の日付 | 2026/04/24 |
| %TIME% | 現在時刻 | 09:30:45.12 |
| %CD% | カレントディレクトリ(現在の場所) | C:\work |
| %~dp0 | バッチファイル自身があるフォルダのパス | C:\Scripts\ |
| %~f0 | バッチファイル自身のフルパス | C:\Scripts\test.bat |
%~dp0 は特に重要です。バッチファイルと同じフォルダにあるファイルを参照するときに使います。これがあると、バッチファイルをどのフォルダに置いても正しく動作します。
遅延展開(!変数!)― ループ内で変数を更新する
バッチファイルの変数は行が解析されるとき(実行前)に展開されます。このため、forループやifブロック内で変数を更新しても、%変数% では更新後の値が取得できません。これを解決するのが「遅延展開」です。
@echo off
rem NG例:ループ内でCOUNTが更新されない
set COUNT=0
for %%i in (A B C D E) do (
set /a COUNT+=1
echo %COUNT% ← 常に0が表示される(解析時に展開されてしまう)
)
rem OK例:遅延展開を使う
setlocal enabledelayedexpansion
set COUNT=0
for %%i in (A B C D E) do (
set /a COUNT+=1
echo !COUNT! ← 1,2,3,4,5と正しく表示される
)
echo 合計: !COUNT!個使い方:バッチファイルの先頭(@echo off の直後)に setlocal enabledelayedexpansion と書き、ループ内で変数を参照するときは %変数% ではなく !変数!(感嘆符)を使います。
まとめ
- set 変数名=値 で変数を定義。=の前後にスペースを入れてはいけない
- set /a で数値計算(整数のみ。余りは%%と書く)
- set /p でユーザーからのキーボード入力を受け取れる
- %~dp0 でバッチファイル自身のフォルダパスを取得できる(場所に依存しないバッチを作れる)
- ループ内で変数を更新・参照するには setlocal enabledelayedexpansion と !変数! が必要
遅延展開は最初に知ったとき「なんでこんな仕様なんだ」と思いましたが、バッチファイルの歴史的な経緯によるものです。ループ内でカウンターが更新されないバグは多くの人がハマる落とし穴なので、最初から setlocal enabledelayedexpansion を書く習慣をつけておくと安心です。
hobbyshift管理人



コメント