最近の記事
- 4/24 - 優先順位
- 3/17 - vbNullString と 空文字列 ""
- 3/15 - InputBox 関数の戻り値
- 3/13 - 紙と Excel と VBA
- 3/9 - 未だに Visual Basic 6
- 11/14 - ぼて閉鎖
- 11/9 - 関数オブジェクトの呼び出し
- 9/7 - メソッドとしての関数オブジェクト
- 8/18 - コンストラクタとしての関数オブジェクト
- 8/4 - オブジェクトの生成
Entering Passive Mode
shebang の行かどうかは、
先頭が#! で開始しているかどうかを調べればいい。
if "%SHEBANG:~0,2%" == "#!" echo SHEBANG!
ただ、一昨日のプログラムでは、
for によって特殊変数に行を読み込んでいたため、
そのままでは文字列の部分比較ができない。
そのため、一度普通の変数に格納する必要がある。
set SHEBANG=%s
さて、昨日は読み込んだ行を出力しただけだったが、
shebang を調べるためには、
行の内容を解析する必要がある。
しかし、コマンドプロセッサでは、
変数に対して行える操作は限られている。
特殊変数がもつ、パスの一部分を抜き出す機能は、
数少ない操作の一つである。
特殊変数は、コマンド引数や for の引数であるため、
ファイル名に対して使うことが多い。
そのためにそのような機能になっていると考えられる。
今日は、ファイルの先頭行を読み出してみよう。
Windows 環境には、ファイルの部分行を得るコマンドがない。
Linux などでは、head コマンドが使えるのだが。
仕方ないので、for コマンドを逆用する。
for コマンドは、テキストファイルの各行を
トークンに分割する機能があるが、
これを抑止すれば、行単位で繰り返すことができる。
for の delims オプションに文字を指定しなければ、
トークンの分割を抑止することができる。
さらに、eol オプションに文字を指定しなければ、
行末までの文字列を全て読み出すことができる。
括弧がより効果を発揮するのは、
if などを組み合わせた場合だ。
if は、条件式の後にコマンドを取るが、
そこに括弧コマンドを使用すると、
以下のような書式が可能となる。
if "string"=="string" (
コマンド1
コマンド2
…
)
括弧には、コマンド終端を明確にする役割以外に、
複数のコマンドをまとめる役割もある。
開き括弧はコマンドの一種であり、
コマンドを書く場所であればどこでも利用できる。
コマンドプロセッサが開き括弧を見つけた場合、
コマンド行を記憶するモードに入る。
その後のコマンドは、記憶されるがすぐに実行はされない。
閉じ括弧が見つかった時点で、
今まで入力されたコマンドが一気に実行される。
今日は if コマンド。
プログラミングの経験者は、コマンドの名前だけで
このコマンドの役割は分かると思う。
if コマンドは条件による分岐を行う。
コマンドプロンプト上で実行する場合はあまり使わないが、
バッチファイル上では、処理の分岐に使う事が多い。
if 文の構文は以下の通り。
if string==string コマンド
if "string"=="string" コマンド
バッチファイルのコマンド引数や、
for 文に渡される変数は、% の後に 1 文字続く形である。
これらの変数は特殊変数と呼ばれる。
%0 はバッチファイルの名前を意味し、
%1 はバッチファイルの 1 つめの引数、
%9 はバッチファイルの 9 つめの引数だ。
%* は元の引数を分解せずにそのまま保持している。
これら特殊変数には、~ と組み合わせることによって、
ファイル名の部分展開の機能があることは前に説明した。
今日は、for コマンドの /f スイッチをやろう。
/f スイッチは非常に特殊で、
テキストファイルの内容や文字列、
そしてコマンドの実行結果に対して、
一行ずつ繰り返しを実行することができる。
構文は以下の通り。
「for /f "オプション" 変数 in (対象) do 繰り返しコマンド」
cmd には、for というコマンドがある。
for は、ディレクトリ内にあるファイルに対して
繰り返しを行うコマンドだ。
cmd で試してみよう。
まずはコマンドプロンプトを起動する。
そして、カレントディレクトリを C:\WINDOWS にする。
C:\Documents and Settings\kes>cd \WINDOWS
さて、for コマンドを実行してみる。
実行すると、C:\WINDOWS 配下のテキストファイルの名前が
ずらっと表示されたはずだ。
Shebang を処理するためには、
どこかのプログラムがまずはスクリプトを開き、
一行目を読んで処理系のパスを調べ、
そのパスにスクリプトを渡して起動する必要がある。
どこかのプログラムと言うのが、通常はシェルなのだが、
Windows では Apache などを介する必要があり面倒だ。
さて、専用のプログラムを作るのは簡単だが、
今日はあえてバッチファイルで作ってみよう。