Entering Passive Mode

カテゴリ 'Windows' の記事
< 1 2 >

shebang の解析と実行

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 文の構文は以下の通り。

if string==string コマンド
if "string"=="string" コマンド

特殊変数と変数

バッチファイルのコマンド引数や、
for 文に渡される変数は、% の後に 1 文字続く形である。
これらの変数は特殊変数と呼ばれる。

%0 はバッチファイルの名前を意味し、
%1 はバッチファイルの 1 つめの引数、
%9 はバッチファイルの 9 つめの引数だ。
%* は元の引数を分解せずにそのまま保持している。

これら特殊変数には、~ と組み合わせることによって、
ファイル名の部分展開の機能があることは前に説明した。

for コマンド(続き)

今日は、for コマンドの /f スイッチをやろう。

/f スイッチは非常に特殊で、
テキストファイルの内容や文字列、
そしてコマンドの実行結果に対して、
一行ずつ繰り返しを実行することができる。

構文は以下の通り。

「for /f "オプション" 変数 in (対象) do 繰り返しコマンド」

for コマンド

cmd には、for というコマンドがある。
for は、ディレクトリ内にあるファイルに対して
繰り返しを行うコマンドだ。

cmd で試してみよう。
まずはコマンドプロンプトを起動する。
そして、カレントディレクトリを C:\WINDOWS にする。

C:\Documents and Settings\kes>cd \WINDOWS

さて、for コマンドを実行してみる。
実行すると、C:\WINDOWS 配下のテキストファイルの名前が
ずらっと表示されたはずだ。

バッチファイル

Shebang を処理するためには、
どこかのプログラムがまずはスクリプトを開き、
一行目を読んで処理系のパスを調べ、
そのパスにスクリプトを渡して起動する必要がある。

どこかのプログラムと言うのが、通常はシェルなのだが、
Windows では Apache などを介する必要があり面倒だ。

さて、専用のプログラムを作るのは簡単だが、
今日はあえてバッチファイルで作ってみよう。

< 1 2 >
このページのトップへ戻る
© 2008 Project Loafer/Project Fireball and all blog writers. Powered by Nucleus CMS