#括弧の概説
コマンドプロンプト上での括弧"( )"は、主に囲まれた範囲をif文などでまとめて制御する為に使うものですが、実は標準入出力もまとめる効果があります。
例えばvar,set,dirコマンドの結果をoutput.txtに続けて出力する場合、リダイレクトだけを使って出力しようとすると…
ver >output.txt
set >>output.txt
dir >>output.txt
普通はこう書きますが、括弧を利用することで
(
ver
set
dir
)>output.txt
と一回のリダイレクトで記述することが出来ます。
普通にコマンドプロンプト上で実行(そのままconに出力)した場合は、
括弧を使わずに書いた場合と違いがわかりませんが、リダイレクトやパイプを使うと違いがわかります。
#応用例
###ヒアドキュメントもどき
sh系のシェルにはヒアドキュメントという複数行テキストをスクリプトに埋め込む手法がありますが、コマンドプロンプトにはありません。
しかし括弧とechoを使うとと似たようなことが出来ます。正直エレガントではないですが仕方がない。
(
echo.abc
echo.
echo.ghi
)>afile.txt
結果(afile.txtの中身)
abc
ghi
ECHOコマンドを連続記述し、最後に一回だけリダイレククトすれば、echo文毎にリダイレクトするよりも簡潔に記述することが出来ます。
なお、echoコマンドは引数を与えないと現在のecho状態が表示されてしまいます。これだと空白行を出力するのに不都合なため、echoコマンドの直後はスペースではなくピリオド(.)を入力しておくとecho状態が表示されません。
###ヒアドキュメントもどき・パイプ利用
パイプ | を利用し標準入力として別のコマンドに送りつけることも可能です。
例えばdiskpartをこの方法で制御すれば、外部ファイルを用意しなくても一つのバッチファイルで作業が完了します。
次の例はdiskpartで仮想HDDイメージをバッチ作成する方法です。
SET VDISK=%TEMP%\workdisk.vhd
SET VDRIVE=K
(
echo create vdisk file="%VDISK%" maximum=65536 type=expandable
echo select vdisk file="%VDISK%"
echo attach vdisk
echo clean
echo create partition primary
echo format fs=ntfs quick
echo assign letter=%VDRIVE%
)|diskpart
rem 例によってエラーは考慮していないので注意を。
このように記述することで同一のバッチファイルにスクリプトを埋め込んだり、むことが可能です。
環境変数を埋め込んだりすることができるのも、単なる外部ファイルでは出来ない強みです。
なお、環境変数を使う場合の注意点として、括弧の間で環境変数を変化させても括弧内からは利用できません。
これはコマンドインタプリタがバッチファイルを解釈する際、括弧を発見すると括弧内の環境変数を一括展開してからコマンドを解釈しようする為に起こる仕様です。