39
60

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-12-24

 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="表示したい文字列"
で、ダミーの変数が不要になる。
39
60
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
39
60

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?