Windowsバッチファイル

バッチファイルの変数の使い方【set・%変数%・環境変数の読み書き完全ガイド】

Windowsバッチファイル
記事内に広告が含まれています。

バッチファイルで「値を保存して後で使う」には変数が欠かせません。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%   ← 2

set /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管理人

コメント

タイトルとURLをコピーしました