Help us understand the problem. What is going on with this article?

.bat(バッチファイル)で、setコマンドを使いこなすための5つの豆知識

More than 3 years have passed since last update.

 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="表示したい文字列"
で、ダミーの変数が不要になる。
plcherrim
バッチファイルが好き。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away