findコマンドの基本的な使い方が分かったところで、これを応用してみよう。まずは、あるコマンドの出力結果から不要な行を取り除く方法である。このためには、findをフィルタとして使う。例えばdirコマンドを実行させた場合に、その出力の前後に付いている不要な表示を削って、ファイルとディレクトリの表示行のみにしたい場合には次のようにする。
C:\cmd>dir
ドライブ C のボリューム ラベルがありません。
ボリューム シリアル番号は A024-5237 です
C:\cmd のディレクトリ
2001/02/22 13:38 <DIR> .
2001/02/22 13:38 <DIR> ..
2001/02/22 13:21 17 .aaa
2001/02/22 13:22 <DIR> .bbb
2001/02/22 12:50 177 findtest01.cmd
2001/02/22 13:38 2 r
2001/02/22 12:57 62 text.txt
2001/02/22 13:28 101 text02.txt
5 個のファイル 359 バイト
3 個のディレクトリ 23,152,476,160 バイトの空き領域
C:\cmd>dir | find /v "ボリューム" | find /v "のディレクトリ" | find /v "個のファイル"
2001/02/22 13:38 <DIR> .
2001/02/22 13:38 <DIR> ..
2001/02/22 13:21 17 .aaa
2001/02/22 13:22 <DIR> .bbb
2001/02/22 12:50 177 findtest01.cmd
2001/02/22 13:38 2 r
2001/02/22 12:57 62 text.txt
2001/02/22 13:28 101 text02.txt
dirコマンドの出力結果から、不要な行に含まれる文字列を指定して、“/v”でそれらを表示させないようにしている。1回で1つの文字列しか指定できないので、3回繰り返して3種類の行を削除している。なおこのようなコマンドを(インタラクティブに)実行する場合は、1つずつfindコマンドを追加して、その結果を見ながら実行するよいだろう。[↑]カーソル・キーで直前のコマンドを簡単に呼び出すことができるので、エラーがなければ、次の“|”記号と次のfindコマンドを追加してEnterキーを押す。このような操作を繰り返してその結果を見ながらコマンドを実行するようにすれば、(一度にすべてのコマンドを入力・実行する場合と比べて)各コマンドの実行結果を確実にチェックすることができるし、入力エラーが起こっても簡単に修正することができる。
ところで、上記のようなコマンドでは“のディレクトリ”といったファイル名などがあるとうまくいかないが、ほとんどの場合こういうことはないだろう(逆に、こういう問題も出るし、コマンドプロンプトからの入力が面倒なので、ファイル名やディレクトリ名にはなるべく日本語を使わないようにしたほうがいいだろう。筆者は、MS-DOS時代からの習慣もあるが、いまだにディレクトリやファイル名には日本語を使っていない)。
また、時間の表示のみを行いたい場合には、
C:\cmd>time
現在の時刻: 13:45:52.04
新しい時刻を入力してください:
C:\cmd>time < r | find "現在"
現在の時刻: 13:46:22.21
C:\cmd>
のように、必要な行のみをfindで取り出すことができる。なお、ここで使った“r”というファイルは、改行のみが含まれているファイルである(メモ帳などで、空行が1行入ったファイルを作成する)。この方法は、キー入力を要求するコマンドの入力をスキップする一般的な方法なので、覚えておくとよい。
余談だが、このような場合に日本語での指定が面倒なら、シェルに入った時点で“us”コマンド(あるいは“chcp 437”コマンド)を使って英語モードに切り替えておけばよい。このようにすれば、常に英語でのみ利用が可能になる。
さらに進もう。現在のディレクトリにABCという名前のディレクトリがあるかどうかは、簡単には判断できない。ifコマンドのexistは、ファイルでもディレクトリでも指定した名前のものがあれば真になってしまう。このような場合には、dirコマンドとfindを使ってディレクトリかどうかを判断することができる。
ファイル:findtest.cmd
1: @echo off
2: dir | find /i "<DIR> %1" >nul
3: if errorlevel 1 goto er
4: echo Found DIR
5: goto end
6: :ER
7: echo Not Found
8: :end
このスクリプトは、引数として指定した文字列(%1)を名前に持つディレクトリの有無を調べるものである。いま、カレント・ディレクトリの状態が次のようになっているとする。
C:\cmd>dir
ドライブ C のボリューム ラベルがありません。
ボリューム シリアル番号は A024-5237 です
C:\cmd のディレクトリ
2001/02/22 13:56 <DIR> .
2001/02/22 13:56 <DIR> ..
2001/02/22 13:21 17 aaa
2001/02/22 13:22 <DIR> bbb
2001/02/22 13:53 <DIR> abc
2001/02/22 12:50 177 findtest01.cmd
2001/02/22 13:58 124 findtest02.cmd
2001/02/22 13:38 2 r
2001/02/22 12:57 62 text.txt
2001/02/22 13:28 101 text02.txt
6 個のファイル 483 バイト
4 個のディレクトリ 23,152,476,160 バイトの空き領域
ここで先のファイルを実行すると、以下のような実行結果が得られる。
C:\cmd>findtest.cmd abc
Found DIR
C:\cmd>findtest.cmd def
Not Found
C:\cmd>findtest.cmd aaa
Not Found
C:\cmd>findtest.cmd bbb
Found DIR
このように、コマンドの出力に対してfindを適用し、その実行結果のerrorlevelを判定することで、コマンドの出力中に指定した文字列が含まれているかどうかを判断できるわけである。
このほか、ネットワークが生きているかどうか(ドメイン内の他のマシンが見えているかどうか)を調べるには、次のようにすればよいだろう(ここで“HOST”は、自ホストの名前を表すものとする)。
ファイル:findnet.cmd
1: @echo off
2: net view | find /v "\\HOST" | find "\\" >NUL
3: if errorlevel 1 goto NO
4: echo Network is Active
5: goto end
6: :NO
7: echo Network is down?
8: :end
net viewコマンドは、実行してみれば分かるが、ドメイン(ワークグループ内)内にあるマシンの一覧を表示するためのコマンドである(ただし自分自身も含まれる)。このため、まず自分のマシン名以外の行をfindで通過させ、その後、マシン名の先頭に付く“\\”を含む行があるかどうかをチェックする。
ネットワーク・ケーブルがマシンから抜けているような場合には、net viewコマンドは、「一覧にエントリが存在しません」などという表示になるのだが、例えば、ハブには正しく接続されていても、ほかのノードがまったく見えないような場合(例えば、IPアドレスの設定が間違っていて、他のノードと通信できないような場合)には、自分しか表示されない。このような状態を含めて、「他のマシンが見えない」ことを判定するには、上記の方法を利用する。
バッチ・スクリプトでは多くの場合、コマンドの実行結果を判定しようとしても、errorlevelコマンドしか利用できない。このような場合には、findコマンドと組み合わせてコマンドの出力に特定の文字列が含まれるかどうかを判定すれば、より複雑なチェックを行うことができる。
Copyright© Digital Advantage Corp. All Rights Reserved.