9
7

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.

Windowsコマンドラインにおける括弧の活用

Last updated at Posted at 2016-12-10

#括弧の概説
コマンドプロンプト上での括弧"( )"は、主に囲まれた範囲を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イメージをバッチ作成する方法です。

ヒアドキュメントもどき+diskpartによるVHDバッチ作成
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 例によってエラーは考慮していないので注意を。

このように記述することで同一のバッチファイルにスクリプトを埋め込んだり、むことが可能です。
環境変数を埋め込んだりすることができるのも、単なる外部ファイルでは出来ない強みです。
なお、環境変数を使う場合の注意点として、括弧の間で環境変数を変化させても括弧内からは利用できません。
これはコマンドインタプリタがバッチファイルを解釈する際、括弧を発見すると括弧内の環境変数を一括展開してからコマンドを解釈しようする為に起こる仕様です。

9
7
0

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
9
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?