【Batch】バッチ ~ 基本編 / 変数の扱い ~

■ はじめに

【1】バッチファイルに引数を渡す
【2】値の設定
【3】値の参照
【4】値の計算
【5】ユーザからの入力値を変数に設定
【6】文字列
【7】遅延環境変数

【1】バッチファイルに引数を渡す

引数 説明
%0 {バッチファイル名を表す
%1~%9 1番目の引数から9番目の引数 を表す
%* 全ての引数 を表す

サンプル

* 以下を、ファイル名「sample.cmd」で保存し、 
コマンドプロンプトで「sample a b c d」と入力し、バッチを実行する

sample.cmd

@echo off
echo バッチファイル名 : %0
echo 1番目の引数 : %1
echo 3番目の引数 : %3
echo すべての引数 : %*
pause

【2】値の設定

 構文

SET 【変数】=【設定値】

サンプル

SET JAVA_HOME=C:\Program Files\Java\jdk1.8.0

【3】値の参照

 * 設定した値を使用したい場合は『%変数%』で
 変数名の前後に『%』を付ける

構文

%【変数】%

 サンプル

echo JAVA_HOME : %JAVA_HOME%

 補足:環境変数について

 * 環境変数も『%変数%』で参照できる(使用例:%JAVA_HOME%)

【4】値の計算

構文

set /a 【変数名】=【演算式】

 サンプル

set /a ans=1+1

【5】ユーザからの入力値を変数に設定

構文

SET /p 【変数】="【メッセージ】"

サンプル

set /p data="input data, please : "

@echo off
set /p data="input data, please : "
echo あなたの入力値は、%data%ですよね?
pause

【6】文字列

サンプル

@echo off

REM 結合
SET value1=Hello
SET value2= World!

SET result=%value1%%value2%

echo Reult : %result%
pause

【7】遅延環境変数

if/forブロック内で変数を変更した場合、更新されない

更新されない例

@echo off

set counter=1
if %counter% == 1 (
  REM +1する
  set /a counter+=1
  REM 「2」を期待するが「1」
  echo %counter%
)
pause

setlocal EnableDelayedExpansion

* cf. expansion = 拡張, 展開

* for文の中で値を変更したい場合、
 for文全体を「setlocal EnableDelayedExpansion」と
 「endlocal」で挟む必要がある
 => 遅延環境変数を有効にする

* for文内で使用する変数は「%」ではなく「!」で囲む

更新できる例

@echo off

set counter=1

REM 遅延環境変数を有効にする
setlocal EnableDelayedExpansion
if !counter! == 1 (
  REM +1する
  set /a counter+=1
  REM 「2」
  echo !counter!
)
endlocal

pause

参考文献

https://qiita.com/plcherrim/items/c7c477cacf8c97792e17
https://jj-blues.com/cms/wantto-changevalueinfor/

参考資料

http://capm-network.com/?tag=Windows%E3%83%90%E3%83%83%E3%83%81%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%A4%89%E6%95%B0
http://www.atmarkit.co.jp/fwin2k/win2ktips/419batchdate/batchdate.html
 

関連記事

バッチ ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2010/07/06/223905
バッチで簡易テストデータを作ることを考える
https://dk521123.hatenablog.com/entry/2021/04/24/182143