setコマンドはバッチファイルに必須のコマンドです。
そこで、setコマンドの豆知識的な機能を紹介します。
#1.set /aに関して
##その数自身を計算するときは、簡単な書き方ができる。
set /a num=num+1
set /a num+=1
上のふたつは同じ結果になります。
##複数の計算は1行にまとめられる!
set /a num1*=2
set /a num2-=10
という2つの計算は、
set /a num1*=2,num2-=10
とまとめられます。
カンマでまとめられるのは/aだけです!
##数値に限り多重展開できる!
set num1=123
set num2=456
set num3=789
をfor文で展開してすべての和をsumに出力したい。
for /l %%i in (1,1,3) do (
set /a sum+=num%%i
)
何が言いたいかというと、遅延展開を使って!num%%i!とする必要がないんですよね。
なので、例えば
set num1=100
set name100=hoge
set hoge=123456789
とあってnum1から123456789を導いてresultに出力したいとき、/aを使わないと
call call set result=%%%%%%name%num1%%%%%%%
としなければならないのですが、/aを使うと
set /a result=!name%num1%!
とできるわけです。
まあ極端な例ですが…
##/aは遅延展開される!
@echo off
set a=1
if 1 == 1 (
set /a a+=1
set b=%a%
set /a c=a
)
echo %a%,%b%,%c%
pause >nul
exit
このバッチファイルでは、if文のカッコの中でaの値が変わっています。
()内は1文とみなされるので、set b=%a%
のaは1のまま。
しかし、その下のset /a c=a
はその場で展開されるのです。そのため、最後のechoの結果は
2,1,2
となります。つまり、数値に限り、遅延展開の記号を使わなくても遅延展開できるのです。
#2.set /pに関して
##改行無しのechoもどきができる!(加筆あり)
set name1=タカシ
set name2=ハナコ
set name3=ジロウ
:
:
set name1000=ジュンイチ
というデータを、スペース区切りで「1行で」表示したい。
普通だと
echo %name1% %name2% ..... %name999% %name1000%
と面倒な入力が必要ですが、set /pとforを合わせると
for /l %%i in (1,1,100) do set /p n=!name%%i! <nul
という短い文章で済みます。
使い方は、set /p 適当な変数(ダミー)=表示したい文字列<nul
DamashiGami様からの情報
set /p<nul="表示したい文字列"
で、ダミーの変数が不要になる。