さて、昨日は読み込んだ行を出力しただけだったが、
shebang を調べるためには、
行の内容を解析する必要がある。

しかし、コマンドプロセッサでは、
変数に対して行える操作は限られている。
特殊変数がもつ、パスの一部分を抜き出す機能は、
数少ない操作の一つである。

特殊変数は、コマンド引数や for の引数であるため、
ファイル名に対して使うことが多い。
そのためにそのような機能になっていると考えられる。

今回行いたいのは、変数の内容を分析することである。
if コマンドの文字列比較を使えば、
変数の内容をリテラルや他の変数と比較することはできるが、
変数の一部分を調べることはできない。

このようなことをするためには、
(環境)変数の力を借りる必要がある。
変数は、特殊変数と同じく特別な機能を持つ。
記述の方法により、文字列操作をすることができるのだ。

変数は %name% の形をしていることは前に述べた。
これを %name:~数値,数値% の記法を使うことによって、
変数の一部分を展開することができる。
上級言語における、substring のようなことができるのだ。

例えば、環境変数 OS には、
オペレーティングシステムの簡易名が入る。
これに対して上記の記法で部分的に取り出してみよう。

echo %os% => Windows_NT

一つ目の数値は、0 から始まる文字列の文字位置、
二つ目の数値は、抜き出す文字数だ。

echo %os:~0,7% => Windows
echo %os:~3,6% => dows_N

一つ目の数値を省略すると、0 とみなされる。

echo %os:~,7% => Windows

二つ目をカンマと共に省略すると残り全てを意味する。

echo %os:~8% => NT

一つ目に負の値を指定すると、文字列の最後から数える。

echo %os:~-2% => NT
echo %os:~-9,6% => indows

二つ目に負の値を指定すると、
指定した数値の絶対値文字数だけ後ろから除外する。

echo %os:~0,-2% => Windows_
echo %os:~4,-2% => ows_
echo %os:~-8,-4% => ndow

これらと、if コマンドを組み合わせれば、
文字列の部分比較が可能となる。

if /i "%os:~,7%"=="windows" echo Windows!