連載
» 2001年03月01日 00時00分 公開

Windows 2000 活用講座 Windows 2000 コマンドライン徹底活用:第6回 findコマンド (1/2)

GUIだけでは面倒な定型処理やシステムのメンテナンスも、コマンドラインを使えば効率よく作業できる。

[塩田紳二,著]
Windows 2000 活用講座 Windows 2000 コマンドライン徹底活用
Windows Server Insider


「Windows 2000 活用講座 Windows 2000 コマンドライン徹底活用」のインデックス

連載目次


 前回まででスクリプトに関する基本的な解説が終わったので、今回からは、コマンドプロンプトで利用できるコマンドについて解説していくことにする。基本的には、cmd.exe/command.comが持つ内部コマンドと、Windows 2000が持つ、コンソールコマンド(ウィンドウを作らないコマンドプロンプトで利用できるもの)を対象とする。

 これらを使ってバッチ・スクリプトを作るのだが、MS-DOSの時代から、これはかなり制限のあるプログラミング環境で、ちょっと工夫しないと、実用的な機能をバッチ・スクリプトで実現するのは難しい。逆にそこが、プログラミングの腕の見せどころでもある。もしウィンドウを開いたり、何でも自由にしたりしたければ、Windows Scripting Host(WSH)でVBScriptやJScript、あるいはVisual Basicなどを使えばよいだろう。ただこのバッチ・スクリプトは、ある意味どんなWindows 2000上でも動かすことが可能で、コンポーネントのインストール状況に左右されるWSHとは違って、本当の共通スクリプト環境である。このため、たとえ普段使わないマシンでいきなり作業することになっても、バッチ・スクリプトを簡単に書けるようになっていれば、ほとんど怖いモノなしともいえる。

 さて今回は、外部コマンドであるfind.exeを取り上げる。

findコマンドを使う

 findコマンドは、指定した文字列をファイルの中から行単位で検索するためのコマンドであり、その書式は、

find [/v][/c][/n][/i] "検索文字列" ファイル名...

となっている(コマンドプロンプト上で「find /?」を実行すれば、詳しいヘルプ情報が得られる)。ここで、各オプションは、

/v 指定した文字列を含まない行を出力する

/c 指定した文字列を含む行の数(行数)を出力する

/n 出力する行の前に行番号を付ける

/i  大文字と小文字を区別しないで検索を行う

となっている。例えば“name”という文字列を含む行をtext.txtというファイル中から探す場合には、

C:\cmd>find "name" text.txt

---------- TEXT.TXT
My name is Shioda.

C:\cmd>

とする。検索文字列は、必ずダブルクォート記号(" ")で囲む必要がある。また、ダブルクォートを含む文字列の場合には、文字列中では2つのダブルクォートを使用する。例えば「he said "This is a Pen."」という文字列を検索する場合には、

C:\cmd>find "he said ""This is a Pen.""" text.txt

---------- TEXT.TXT
he said "This is a Pen."

とする。検索先のファイル名は複数指定が可能で、Windows 2000のコマンドプロンプトではワイルドカードも利用できる(Windows 9xやMeの場合には、ワイルドカードは利用できなかった)。なおfindは行単位で検索を行うコマンドであり、2行以上にまたがるような文字列の検索は行えない。

C:\cmd>find "name" text*.*

---------- TEXT.TXT
My name is Shioda.

---------- TEXT02.TXT
My name is Smith.

 “/v”オプションは、指定した文字列を“含まない行”をすべて出力するオプションである。次の例でいうと、“name”という文字列を含まない行が表示される。

C:\cmd>find /v "name" text.txt

---------- TEXT.TXT
This is a pen.
he said "This is a Pen."

 “/c”は、指定した文字列を含む行の数を出力する。例えば、

C:\cmd>find /c "name" text.txt

---------- TEXT.TXT: 1

となる。これは、“name”を含む行が1行あるということを表している。

 “/n”は、文字列を検索して該当の文字列を含む行を表示するときに、先頭に行番号を表示するオプションである。

C:\cmd>type text02.txt
My name is Smith.
This is my pen.
"OK"
My pen is red.
His pen is green.
Her pen is blue.

C:\cmd>find /n "pen" text02.txt

---------- TEXT02.TXT
[2]This is my pen.
[4]My pen is red.
[5]His pen is green.
[6]Her pen is blue.

このように、行の先頭に“[”と“]”で囲まれて行番号が表示される。

 “/i”オプションは、大文字と小文字を区別させないようにするオプションである。このオプションが指定されていない場合、findは英字の大文字/小文字を区別した検索(例:“A”と“a”は異なるものとして扱う)を行う。

C:\cmd>find "pen" text.txt

---------- TEXT.TXT
This is a pen.

C:\cmd>find /i "pen" text.txt

---------- TEXT.TXT
This is a pen.
he said "This is a Pen."

また、findは、フィルタとしても利用可能で、この場合には、標準入力から入ってきたデータに対して検索を行う。このため、前述の例は、

C:\cmd>type text.txt | find "name"
My name is Shioda.

もしくは

C:\cmd>find "name" < text.txt
My name is Shioda.

と記述することもできる。ただしこの場合、ファイル名の表示が行われず、最初の例とは出力結果が異なることに注意されたい(余分な情報が表示されないので、こちらの方が便利なことも多いだろう)。

 ここでfindの検索結果の状態(指定した条件にマッチする文字列が見つかったかどうか)を調べる方法について述べておこう。このfindでは、検索結果の状態をerrorlevel(直前のコマンドの実行結果を表すコマンド)を使って通知することができる。検索が成功した場合には、errorlevelの値は0になるが、検索が失敗した場合(該当の文字列がなかった場合)には、errorlevelは1となる。また、引数の指定方法などが間違っていてエラーとなった場合は(例えば、検索文字列をダブルクォートでくくっていないときは)、errorlevelは2となる。ifコマンド中でこのerrorlevelの値を調べることにより、検索結果に応じた処理を行うことができる。


       1|2 次のページへ

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。