Windowsのバッチファイル(.batファイル)でよく使われる「set」コマンドは、変数を定義・操作するための基本コマンドです。
この「set」を使いこなすことで、動的な処理や条件分岐が可能になり、バッチファイルの自動化やメンテナンスが一気に楽になります。
変数とは プログラミングでいう「箱」のようなもので、データを一時的に保存しておける仕組みです。例えば、ユーザー名やファイルパス、計算結果などを保存できます。
バッチファイルでできること
- ファイルの一括処理
- システム設定の自動化
- 定型作業の効率化
- 複雑な条件判断
でも、最初は「どうやって使えばいいの?」と戸惑う方も多いのではないでしょうか。
この記事では、Windowsバッチファイルでの「set」コマンドの基本から応用例、注意点まで、丁寧に解説します。
「set」コマンドの基本の使い方

変数を設定する
最も基本的な使い方は、変数に値を設定することです。
set myname=佐藤
コードの説明
set
:変数を設定するコマンドmyname
:変数の名前=
:代入を表す記号佐藤
:設定する値
重要なポイント
set myname=佐藤 ←正しい
set myname = 佐藤 ←間違い(スペースが含まれる)
変数を参照する
設定した変数の値を使うときは、変数名を %
で囲みます。
set myname=佐藤
echo %myname%
実行結果
佐藤
複数の変数を使った例
set lastname=佐藤
set firstname=太郎
echo %lastname%%firstname%さん、おはようございます!
実行結果
佐藤太郎さん、おはようございます!
ユーザーからの入力を受け取る
/p
オプションを使うと、ユーザーに入力を求めることができます。
set /p username=あなたの名前を入力してください:
echo %username%さん、こんにちは!
pause
実行の流れ
- 「あなたの名前を入力してください: 」と表示される
- ユーザーが名前を入力してEnterを押す
- 入力された名前が表示される
数値の計算
/a
オプションを使うと、数値の計算ができます。
set /a result=10+20
echo 計算結果: %result%
実行結果
計算結果: 30
使用できる演算子
+
:足し算-
:引き算*
:掛け算/
:割り算%
:割り算の余り
基本的な変数操作をマスターしたら、次はより便利なオプションを見ていきましょう。
便利な「set」コマンドのオプション活用

環境変数の表示
現在設定されているすべての環境変数を確認できます。
set
このコマンドを実行すると、PATH、TEMP、USERNAMEなど、システムに設定されている変数がすべて表示されます。
特定の文字で始まる変数を表示
set p
実行結果の例
PATH=C:\Windows\system32;C:\Windows;...
PATHEXT=.COM;.EXE;.BAT;.CMD;...
PROCESSOR_ARCHITECTURE=AMD64
これは「p」で始まる変数のみを表示します。
文字列の一部を取得
文字列の特定の部分だけを取り出すことができます。
set fullname=佐藤太郎
set lastname=%fullname:~0,2%
set firstname=%fullname:~2,2%
echo 姓: %lastname%
echo 名: %firstname%
実行結果
姓: 佐藤
名: 太郎
構文の説明
~0,2
:0文字目から2文字取得~2,2
:2文字目から2文字取得
文字列の置換
文字列の一部を別の文字に置き換えることができます。
set message=こんにちは、世界!
set newmessage=%message:世界=皆さん%
echo %newmessage%
実行結果
こんにちは、皆さん!
日付と時刻の取得
システムの日付と時刻を変数に格納できます。
set current_date=%date%
set current_time=%time%
echo 今日の日付: %current_date%
echo 現在の時刻: %current_time%
ランダムな数値の生成
ランダムな数値を生成することもできます。
set /a random_num=%random% %% 100
echo 0から99のランダムな数値: %random_num%
これらのオプションを組み合わせることで、より高度な処理が可能になります。
「set」コマンドの実践活用例

例1:ログファイル名に日時を含める
@echo off
set today=%date:~0,4%%date:~5,2%%date:~8,2%
set logfile=log_%today%.txt
echo ログファイル名: %logfile%
echo プログラム開始 > %logfile%
echo 処理中... >> %logfile%
echo プログラム終了 >> %logfile%
echo ログを %logfile% に保存しました
pause
実行結果
ログファイル名: log_20241218.txt
ログを log_20241218.txt に保存しました
例2:ファイルの一括処理
@echo off
set source_folder=C:\temp\source
set backup_folder=C:\temp\backup
set /p file_type=処理したいファイルの拡張子を入力してください(例: txt):
echo %source_folder%の*.%file_type%ファイルを%backup_folder%にコピーします
xcopy "%source_folder%\*.%file_type%" "%backup_folder%\" /Y
echo コピーが完了しました
pause
例3:条件に応じた処理の分岐
@echo off
set /p age=あなたの年齢を入力してください:
if %age% GEQ 20 (
set category=大人
) else (
set category=未成年
)
echo あなたは%category%です
pause
例4:カウンターを使った繰り返し処理
@echo off
set /a count=0
set max=5
:loop
set /a count=%count%+1
echo 処理中... %count%/%max%
if %count% LSS %max% goto loop
echo すべての処理が完了しました
pause
例5:設定ファイルの読み込み
@echo off
echo username=佐藤 > config.txt
echo department=営業部 >> config.txt
for /f "tokens=1,2 delims==" %%a in (config.txt) do (
set %%a=%%b
)
echo ユーザー名: %username%
echo 部署: %department%
pause
例6:メニュー形式の選択
@echo off
:menu
echo ======================
echo メニューを選択
echo ======================
echo 1. ファイルの一覧表示
echo 2. 現在の日時表示
echo 3. システム情報表示
echo 4. 終了
echo ======================
set /p choice=選択してください (1-4):
if "%choice%"=="1" goto show_files
if "%choice%"=="2" goto show_datetime
if "%choice%"=="3" goto show_system
if "%choice%"=="4" goto end
echo 無効な選択です
goto menu
:show_files
dir
pause
goto menu
:show_datetime
echo 現在の日時: %date% %time%
pause
goto menu
:show_system
systeminfo | findstr /C:"OS Name" /C:"Total Physical Memory"
pause
goto menu
:end
echo プログラムを終了します
「set」コマンド使用時の注意点
注意1:スペースの扱い
set name=佐藤 ←正しい
set name = 佐藤 ←間違い(変数名が「name 」になる)
set name= 佐藤 ←間違い(値が「 佐藤」になる)
スペースを含む値を設定する場合
set fullname=佐藤 太郎
echo %fullname%
注意2:特殊文字の扱い
パーセント記号(%)
set message=進捗: 50%%
echo %message%
パーセント記号を文字として使うには %%
と書きます。
感嘆符(!)
setlocal enabledelayedexpansion
set count=0
for %%i in (1 2 3) do (
set /a count=!count!+1
echo 現在のカウント: !count!
)
ループ内で変数を正しく参照するには !変数名!
を使います。
アンパサンド(&)
set command=dir ^& pause
%command%
特殊文字をエスケープするには ^
を使います。
注意3:変数名の規則
使用できる文字
- 英数字(A-Z、a-z、0-9)
- アンダースコア(_)
使用できない文字
- スペース
- 記号(=、+、-、*、/など)
良い例
set user_name=佐藤
set file_count=10
set MAX_SIZE=1000
悪い例
set user name=佐藤 ←スペースは使えない
set file-count=10 ←ハイフンは使えない
set 1st_file=test.txt ←数字で始まってはいけない
注意4:大文字と小文字
バッチファイルでは、変数名の大文字と小文字は区別されません。
set username=佐藤
echo %USERNAME% ←これも正しく表示される
echo %Username% ←これも正しく表示される
注意5:予約語との競合
システムが使用している環境変数と同じ名前は避けましょう。
避けるべき変数名
- PATH
- TEMP
- USERNAME
- COMPUTERNAME
高度なテクニック

配列のような使い方
バッチファイルには配列機能はありませんが、工夫で配列のような処理ができます。
@echo off
set fruits[0]=りんご
set fruits[1]=みかん
set fruits[2]=ばなな
for /L %%i in (0,1,2) do (
call echo 果物%%i: %%fruits[%%i]%%
)
pause
関数のような使い方
@echo off
set /p num1=1つ目の数値:
set /p num2=2つ目の数値:
call :add %num1% %num2%
echo 結果: %result%
pause
goto :eof
:add
set /a result=%1+%2
goto :eof
環境変数の一時的な変更
@echo off
setlocal
set PATH=%PATH%;C:\MyProgram
echo 一時的にPATHを変更しました
MyProgram.exe
endlocal
echo 元のPATHに戻りました
エラーハンドリング
@echo off
set /p filename=ファイル名を入力:
if not exist "%filename%" (
echo エラー: ファイル %filename% が見つかりません
pause
goto :eof
)
echo ファイル %filename% を処理中...
実用的なサンプルスクリプト
サンプル1:バックアップスクリプト
@echo off
title 自動バックアップツール
echo ================================
echo 自動バックアップツール
echo ================================
set source=C:\MyDocuments
set destination=D:\Backup
set date_stamp=%date:~0,4%%date:~5,2%%date:~8,2%
set backup_folder=%destination%\Backup_%date_stamp%
echo ソースフォルダ: %source%
echo バックアップ先: %backup_folder%
echo.
set /p confirm=バックアップを開始しますか? (Y/N):
if /i "%confirm%" NEQ "Y" goto cancel
echo バックアップを開始します...
mkdir "%backup_folder%" 2>nul
xcopy "%source%" "%backup_folder%" /E /I /Y
if %errorlevel% EQU 0 (
echo バックアップが正常に完了しました
) else (
echo バックアップ中にエラーが発生しました
)
goto end
:cancel
echo バックアップをキャンセルしました
:end
pause
サンプル2:システム情報レポート
@echo off
set report_file=system_report_%date:~0,4%%date:~5,2%%date:~8,2%.txt
echo システム情報レポートを作成中...
echo ================================ > %report_file%
echo システム情報レポート >> %report_file%
echo 作成日時: %date% %time% >> %report_file%
echo ================================ >> %report_file%
echo. >> %report_file%
echo コンピュータ情報を収集中...
echo [コンピュータ情報] >> %report_file%
systeminfo | findstr /C:"コンピューター名" /C:"OS 名" /C:"総物理メモリ" >> %report_file%
echo. >> %report_file%
echo ディスク情報を収集中...
echo [ディスク情報] >> %report_file%
wmic logicaldisk get size,freespace,caption >> %report_file%
echo. >> %report_file%
echo レポートを %report_file% に保存しました
pause
トラブルシューティング

問題1:変数が設定されない
症状:setコマンドを実行しても変数が空になる
原因と解決法
rem 間違い例
set name = 佐藤
echo %name% ←何も表示されない
rem 正しい例
set name=佐藤
echo %name% ←「佐藤」と表示される
問題2:ループ内で変数が更新されない
症状:for文の中で変数を変更しても反映されない
解決法
setlocal enabledelayedexpansion
set count=0
for %%i in (1 2 3) do (
set /a count=!count!+1
echo !count!
)
問題3:特殊文字が正しく処理されない
症状:パスやコマンドに特殊文字が含まれるとエラーになる
解決法
rem 特殊文字をエスケープ
set command=echo Hello ^& pause
%command%
rem ダブルクォートで囲む
set filepath="C:\Program Files\MyApp\app.exe"
問題4:環境変数が見つからない
症状:%変数名%
が展開されずにそのまま表示される
解決法
rem 変数が存在するか確認
if defined myvar (
echo 変数は設定されています: %myvar%
) else (
echo 変数が設定されていません
)
まとめ:setコマンドを使いこなしてバッチファイルをもっと便利に!
「set」コマンドを理解することで、バッチファイルはただのコマンド羅列から”簡易スクリプト”へ進化します。この記事で学んだ内容をまとめると:
基本操作
- 変数の設定:
set 変数名=値
- 変数の参照:
%変数名%
- ユーザー入力:
set /p 変数名=メッセージ
- 数値計算:
set /a 変数名=式
便利なテクニック
- 文字列操作:一部取得、置換
- 条件分岐:if文との組み合わせ
- 繰り返し処理:ループでのカウンター
- ファイル操作:日付付きファイル名の生成
注意すべきポイント
- スペースの扱いに注意
- 特殊文字はエスケープが必要
- ループ内では遅延展開を使用
- 予約語との競合を避ける
コメント