括弧がより効果を発揮するのは、
if などを組み合わせた場合だ。

if は、条件式の後にコマンドを取るが、
そこに括弧コマンドを使用すると、
以下のような書式が可能となる。

if "string"=="string" (
    コマンド1
    コマンド2
    …
)

少しプログラミング言語っぽくなった。

同じように else も書くことができる。

if "string"=="string" (
    コマンド1
    コマンド2
    …
) else (
    コマンドa
    コマンドb
    …
)

昨日は、閉じ括弧の後に引数を書くなと書いた。
しかし上の例では、else が最初の括弧コマンドの
引数のようにも見える。これはどういうことだろうか。

括弧コマンドは if コマンドの中で使われている。
最も外側にあるのは、if コマンドだ。
つまり、最初の括弧コマンドは、
if コマンドの文脈(コンテキスト)で引数評価されている。

if コマンドのキーワードである else は、
通常、コマンドの一部として処理されてしまう。

C:\>if "abc"=="abc" echo match! else echo not match!
match! else echo not match!

なぜかというと、前の echo の時点で、
コンテキストは echo コマンドに移る。
一般的なコマンドは、行の終端までを引数とするので、
続く else は、echo のコンテキストで引数評価されるからだ。

しかし、括弧コマンドは引数を取らないことが明確なため、
閉じ括弧の直後がコマンドの区切りとして解釈される、

前回は、コマンドプロセッサ上で実行したため、
閉じ括弧の後を解釈するコンテキストが存在しなかったが、
今回は if コマンドのコンテキストに戻るため、
後ろに続く else が if によって解釈される動きとなるのだ。

for コマンドでも書き方は同じだ。

C:\>for /l %f in (3,11,60) do @(
More? echo %f
More? )
3
14
25
36
47
58

上のようにコマンドプロンプト上で入力することは少ないが、
開き括弧の前にある @ マークを見ても、
括弧がコマンドであることが分かると思う。

@ マークは以前出てきたが、
コマンドのエコーバックを防ぐ意味を持つ。

C:\>for /l %f in (3,11,60) do (
More? @echo %f
More? )

C:\>()
3

C:\>()
14

C:\>()
25

C:\>()
36

C:\>()
47

C:\>()
58


どうだろうか。echo だけのエコーバックが抑制され、
括弧コマンドの部分(つまり括弧だけ)が表示されている。