.................................................
<< 10年02月 >>
31 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28


最近のコメント
10/07 北本
09/29 拝承
07/28 北本
07/20 ばてれん
10/26 北本
.............................
何となくリンク
.............................

2020年
02月
05月
2019年
04月 05月
08月 09月
2018年
01月 02月 03月
04月 05月 06月
09月
10月
2017年
01月 02月 03月
04月 05月 06月
07月 08月 09月
10月 11月 12月
2016年
01月 02月 03月
04月 05月 06月
07月 08月 09月
10月 11月 12月
2015年
01月 02月 03月
04月 05月 06月
07月 08月 09月
10月 11月 12月
2014年
01月 02月 03月
04月 05月 06月
07月 08月 09月
10月 11月 12月
2013年
01月 02月 03月
04月 05月 06月
07月 08月 09月
10月 11月 12月
2012年
01月 02月 03月
04月 05月 06月
07月 08月 09月
10月 11月 12月
2011年
01月 02月 03月
04月 05月 06月
07月 08月 09月
10月 11月 12月
2010年
01月 02月 03月
04月 05月 06月
07月 08月 09月
10月 11月 12月
2009年
01月 02月 03月
04月 05月 06月
07月 08月 09月
10月 11月 12月
2008年
01月 02月 03月
04月 05月 06月
07月 08月 09月
10月 11月 12月
2007年
02月 03月
04月 05月 06月
07月 08月 09月
10月 11月 12月

レスを書き込みます




BATのfor文におけるGOTO文のトラップ 2010年2月18日(木)22時08分
分類:マメ知識 [この記事のURL]

みんな大好き自動処理が行えるBAT。
UNIX系OSに比べて圧倒的低機能で出来ることが限られているBATですが
今まで知らない衝撃の新事実が発覚しました。

繰り返し処理と言えば、while文や、for文が真っ先に思いきますが、
素敵な仕様のBATにはwhile文がありません。流石、低機能なだけあります。

選択肢はfor文しか残っていませんが、
これはあらゆる言語と同じ感じで使えます。
逆に言うとfor文は数値のカウント制御しか出来ない単純な繰り返しです。

で、このfor文、BATでは途中で抜けて終了させる事が出来ません。
素敵ですね、本当に。 何でこんな仕様にしたの? って感じです。

抜けさせるには、goto文を使って無理矢理外へ出すしかありません。
以下、%%iの変数に1,2,3‥‥と数値が入っていき、5になったら抜けるというfor文ですが、ある条件になったら抜ける処理を入れる為にはgoto文を書くしかない。
以下の例だと %%i が 3の時に goto文で for文の外に抜けてます。
for /l %%i in (1,1,5) do (
  if %%i equ == 3 ( goto break )
  echo %%i
)
:break


で、ここからが面白い仕様なんですが、まずfor文の中で
goto文を書いた場合、for文の中で、
そのgoto文より下にラベルを書くと構文エラーになります。
良く解りませんね! つまり↓のように書くとエラーになります。
for /l %%i in (1,1,5) do (
  if %%i equ == 3 ( goto break )
  echo %%i
:break ←goto文の後にラベルを書くとエラー!
)


では、goto文の前に書くとどうなるのか?
for /l %%i in (1,1,5) do (
:break ←goto文の前にラベルを書くと?
  if %%i equ == 3 ( goto break )
  echo %%i
)


なんと、for文のカウント変数 %%i が破棄されます。
%%i に 1,2,3‥‥と数値が入った後、goto文で飛ばされると、
%iという文字列に変化します。つまり上記BATを実行すると、
1
2
%i
という結果が出力されます。

for文内で色々な処理分岐させて制御するロジックは使えません。
独自にカウント変数を作成し、if文で制御することで対応しましたが、
この仕様(?)を知った時は正直焦りましたね。

本当に素晴らしい仕様、

ありがとうございました!!


≪コメント(2)
文福茶釜
perl使え。


というか、RHEL上のperlにExpectモジュール組み込んでこれでスクリプトでsuも楽勝だぜウッシッシと思ったら、うまくパスワードが読み込まれなくて凹んだ。
10/02/18 23:04:19
北本
perl 入ってるっぽいな。普通にコマンド実行できる。
まぁ複雑な処理させたかったら、VBSか、それでも駄目ならC言語に逃げます(´ⅴ`)
10/02/20 04:06:38
名前(任意)

nik5.144