コマンドシェル:早引き

Microsoft のコマンドシェルのリファレンスはコマンド以外の内容が何処にあるのか分かりにくいため、ここにまとめる。 Command-Line Reference: Scripting; Management Services | Microsoft Docs

書式

コマンドプロンプトは1行単位でコマンドを解釈して実行する。
以下に示す複数コマンド実行やリダイレクションの為の記号 ( & | < > ) 、もしくは改行までが1コマンドと解釈される。

ただし、コメントのコマンドだけは、改行までをコメントとして扱う。

echo #### & echo ====   #### と ==== が表示される
rem  #### & echo ====   表示なし。(&以降もコメント扱い)

複数コマンド実行

Command shell overview | Microsoft Docs

cmdA  &  cmdB       cmdA の後に cmdB を実行
cmdA  && cmdB       cmdA が成功したら cmdB を実行
cmdA  || cmdB       cmdA が失敗したら cmdB を実行
( cmdA               () 内は改行があっても複数のコマンドの集まりとして実行する。if コマンド等に使用する。
  cmdB )

リダイレクション

コマンドに対する入出力として、標準入力、標準出力、標準エラーがあるが、 それをファイル、もしくは次のコマンドのに渡す方法がある。これをリダイレクションと呼ぶ。 Using command redirection operators: Management Services | Microsoft Docs

cmdA | cmdB         cmdA の標準出力を cmdB の標準入力として渡す
cmdA < file1        cmdA の標準入力として file1 の内容を渡す
cmdA > file1        cmdA の標準出力を file1 に入れる
cmdA >> file1       cmdA の標準出力を file1 に追加する
cmdA 2> file1       cmdA の標準エラーを file1 に入れる
cmdA 2>> file1      cmdA の標準エラーを file1に追加する

変数

変数は環境変数を使用する。その為、基本的には文字列として扱われる。 環境変数に値を代入するには set 命令を使う。環境変数を取得するには両端に%~%をつけると、値に置き換えられる。 set | Microsoft Docs

set AA=             AA の値は 何もなしに
set AA=Name         AA の値は Name という文字列に
set AA="Name"       AA の値は "Name" という文字列に
set AA=4.5          AA の値は 4.5 という文字列に
set AB=AA           AB の値は AA という文字列に
set AB=%AA%         AB の値は 4.5 という文字列に

/A オプションを使うと数式として扱う。式に文字列がある場合には、合致する環境変数の中身を参照し、無ければ0として扱う。 数値以外があった場合にはエラーとなる。

set /A 1+2*3        数値計算を行う。結果 7 を表示する。
set /A AA=1+2*3     AA の値を 7 という文字列に
set /A AB=AA+3      AB の値を 10 という文字列に(AAは環境変数AAの値)
set /A AB=%AA%+3    AB の値を 10 という文字列に(%AA%は環境変数AAの値が展開される)
set /A AB=AC+3      AB の値を 3 という文字列に(ACという環境変数が無いために=0+3となる)

扱える数値は符号付き32bit整数値のみ (2147483647 ~ -2147483648) で少数は扱えない。整数値は10進数の他、8進数、16進数が使用できる。以下の例ではどれも同じ数値を入れている。

set /A AA=256       10進数
set /A AA=0377      8進数 (先頭に0をつける)
set /A AA=0xFF      16進数 (先頭に0xをつける)

set で使用できる演算子と優先は以下の通り。この内、% < > & | の演算子はコマンド上で別の意味を持っているので、式を"~"で囲むか、エスケープシークエンスを使用する

( )          ↑     グループ化
! ~ -       優先    単項演算子  Not(0か1(=0以外)の反対) 1の補数 2の補数
* / %       高い    算術演算子  乗算 除算 剰余
+ -          :     算術演算子  加算 減算
<< >>       優先    論理シフト
&           低い    ビット演算  AND
| ^          ↓     ビット演算  OR XOR

実行

別のバッチファイルを実行 call batchFile
別プロセスで実行  start exefile 拡張子に関連付けされたアプリケーションで実行

コマンド

引数を受け取る

Using batch parameters: Management Services | Microsoft Docs

バッチファイル実行 or バッチファイルのサブルーチンで利用可能

%0              バッチファイル本体のパス
%1, %2...       第1引数、第2引数・・・
%*              %1からの全ての引数(%0は含まない)

%~で次の展開を行います。
(例では、カレントディレクトリ C:\Users\Boo に Foo.txt ファイルがあった場合を想定)

%1                             "Foo.txt"
%~1    %1を展開し、周囲の引用符("")を削除します    Foo.txt
%~f1    %1を完全修飾パス名に展開します。         C:\Users\Boo\Foo.txt
%~d1    %1をドライブ文字に展開します。          C:
%~p1    %1をパスに展開します。              \Users\Boo\
%~n1    %1をファイル名に展開します。           Foo
%~x1    %1をファイル拡張子に展開します。         .txt
%~s1    展開されたパスには、短い名前のみが含まれます。  C:\Users\Boo\Foo.txt
%~a1    %1をファイル属性に展開します。          --a--------       *1
%~t1    ファイルの日付と時刻に%1を展開します。      2018/11/27 10:35    *2
%~z1    %1をファイルのサイズに展開します。        118

*1

属性のフラグが立っている箇所に文字、立っていなければ -、すべての属性が立っていれば drahsc----- になります。 ファイル属性全てに対応していません。(非インデックス対象ファイル、暗号化ファイル、再解析ポイント)

d:ディレクトリ     r:書き込み禁止
a:アーカイブ      h:隠しファイル
s:システムファイル   c:内容を圧縮

引数にスペースが入る場合

特にパス名等ではスペースが入る可能性があるので必ず "~" で囲む。
渡す側が引数を"~"で括っていた場合は、"~"が付いたまま渡されるので、引数を加工する場合は以下の方法で"~"を外す必要がある。

%~1             %1 から"~"を外した文字列

環境変数から"~"を外す場合は、文字列置換式を使う。以下の例では環境変数 ENVVAL から全ての " を消し去る。

ENVVAL = %ENVVAL:"=%

その他

.cmd と .batの違い

  .cmd = NT/2000系、.bat=95/98/Me系、XPで統合。

ERRORLEVEL が 成功でも変化する