【初心者向け】Windowsバッチファイルの「set」コマンド完全ガイド|変数の基本から応用まで解説!

Windows

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

実行の流れ

  1. 「あなたの名前を入力してください: 」と表示される
  2. ユーザーが名前を入力してEnterを押す
  3. 入力された名前が表示される

数値の計算

/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」コマンドを理解することで、バッチファイルはただのコマンド羅列から”簡易スクリプト”へ進化します。この記事で学んだ内容をまとめると:

基本操作

  1. 変数の設定set 変数名=値
  2. 変数の参照%変数名%
  3. ユーザー入力set /p 変数名=メッセージ
  4. 数値計算set /a 変数名=式

便利なテクニック

  1. 文字列操作:一部取得、置換
  2. 条件分岐:if文との組み合わせ
  3. 繰り返し処理:ループでのカウンター
  4. ファイル操作:日付付きファイル名の生成

注意すべきポイント

  1. スペースの扱いに注意
  2. 特殊文字はエスケープが必要
  3. ループ内では遅延展開を使用
  4. 予約語との競合を避ける

コメント

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