これは、VBScript & WSH(Windows Scripting Host) または .NET Framework2.0/4.0 用です


履歴



はじめに
FIND.EXE を頻繁に使います。
だけど、FIND.EXE は、一行の長さ制限があるようです(確か、64kbぐらいだった記憶・・・)

という事で、FIND.EXE のような WSH スクリプトを作ってみました。

スクリプトは、ファイルを全部読み込んでから、改行コードで、Split していますので、ファイルサイズは 2GB までとなるでしょう。
なぜなら、VBScript の変数の最大サイズが 2GB だから

チェック・ルーチンは、InStr() 関数を使っているのですが、これを RegExp などの正規表現にすれば、FIND.EXE ではなくて、FINDSTR.EXE のようなスクリプト(つまり grep のような)に改造できるでしょう

ver2.0 で対応しました。


ver2.0 では、正規表現での検索も可能となりました([/R] オプション)。

ver2.0 では、find.vbs 内のスケルトン関数の中身を実装することで、ユーザ定義関数を使った検索も可能([/U] オプション)
find.vbs はスクリプトだから、まぁ、当然ちゃっ当然だけど・・・

WSH なので、処理自体が遅いです。







.NET Framework 2.0/4.0 版
.NET Framework でも作ってみました。
こちらは、一行ずつ読み込んでいますので、データサイズは無制限でしょう。
既定の入力元は標準入力です。
スクリプトコンポーネントより、VBScriptで記述したマッチングの関数を使用可能です
スクリプトコンポーネントより、Win32 限定となってしまいました。

記述する VBScript への既定のオブジェクトは「findObj」
findObj.ansBool boolean マッチしたかどうかセットしてください。既定は、False に初期化して呼び出されます
findObj.Line String 行番号
findObj.Count String 現在までのヒット数
findObj.SearchStr String 検索文字列(vb.find.exe の第一引数)
findObj.TargetStr String 検索対象の文字列(一行分)
findObj.tempStr String 一時保管用。最初呼び出し時は、空文字列
findObj.tempStr String 一時保管用。最初呼び出し時は、空文字列
findObj.CreateObject(文字列) Object COM オブジェクトをロードするための CreateObject() 関数へのラッパー
findObj.ConsoleWriteLine Void 標準出力(Console.WriteLine)へのラッパー
findObj.ConsoleWrite Void 標準出力(Console.Write)へのラッパー
findObj.ConsoleErrorWriteLine Void 標準エラー出力(Console.Error.WriteLine)へのラッパー
findObj.ConsoleErrorWrite Void 標準エラー出力(Console.Error.Write)へのラッパー



-DisplayFileName
「-InputFile」指定時のみですが、ヒットした場合にファイル名も表示するようにしました。
これは、バッチファイルで、複数ファイルを検索する際に、どのファイルにヒットしたのかが分かるようにしてみました。

例えば、以下のようなバッチファイルで、d:\z 以下の拡張子 php のファイルを検索できますが、「-DisplayFileName」があると、どのファイルでヒットしたかが分かるかと思います。

FOR /R c:\z\ %i in (*.php) DO find.net4.exe xss_clean -InputFile %i -DisplayFileName



-Program
「-InputFile」指定時のみですが、ヒットした場合に外部ファイルの第一引数にファイル名を指定して起動する

この際
  1. 「-ProgramArgs」の指定がない場合は、ファイル名は第一引数に指定される。
  2. 「-ProgramArgs」の指定があり「%s」がある場合は、ファイル名は「%s」に置換される
  3. 「-ProgramArgs」の指定があり「%s」がない場合は、ファイル名は引数の直後に(半角スペースと共に)指定される
「-ProgramTempDir」で起動プログラムのワーキングディレクトリを指定する事も可能

検索だけして、その後の編集には別途プログラムを使いたい場合に便利かも。


ソースの説明
省略


使い方
  1. ダウンロードしたファイルを解凍しします。
    (LHAは、吉崎栄泰氏が、著作権を所有)
  2. 解凍して出来た wsh\find.vbs がスクリプトファイルです。
  3. 解凍して出来た netframework\Interop.MSScriptControl.dll と netframework\find.net[2|4].exe が該当プログラムです。


使い方:
C:\>find.net.exe
find.net.exe version 2.0.0.5
              Create by active@window.goukaku.com
               Compiled ver.v4.0.30319
               Runtime  ver.v4.0.30319(Win32)
usage: find.net.exe 検索文字列 [オプション]....
   /VV : 詳細表示
   /V  : マッチしなかったものをヒットとする
   /N  : 行番号を表示する
   /C  : ヒットした行数を表示する
   /I  : 大文字/小文字を区別しない
   /R  : 検索文字列を正規表現とみなす
   /U  : ユーザ定義関数を使用する
         既定は 言語:"VBScript" で書かれた "find.net.exe.script" というファイル
   -ScriptFile <<スクリプトファイル>>
         /U 時のスクリプトファイルを指定する
   -ScriptLanguage <<スクリプト言語名>>
         /U 時のスクリプト言語名(既定は「VBScript」)
   -ScriptFile_CharSet <<文字コード>>
         /U 時のスクリプトファイルの文字コード(既定は「Shift_JIS」)
   -InputFile <<入力ファイル>>
         入力元を "標準入力" からファイルに切り替える
   -DisplayFileName
         ヒットしたら一度だけファイル名も表示する
   -Program <<外部プログラム>>
         ヒットしたらファイルを外部プログラムで起動する
   -ProgramArgs <<外部プログラムの引数>>
         ヒットしたらファイルを外部プログラムで起動する、その引数(ファイル名は「%s」に置換さ れる)
   -ProgramTempDir <<外部プログラムの一時フォルダ>>
         ヒットしたらファイルを外部プログラムで起動する、そのワーキングディレクトリ
   -InputFile_CharSet <<文字コード>>
         入力ファイルの文字コード(既定は「Shift_JIS」)
   -AfterLine <<行数>>
   -BeforeLine <<行数>>
         ヒットした前後の行を表示する
   -DisplayNoHit
         ヒットしなくても表示する
   -SoundHitFile "Wavファイル"
         ヒットした際にサウンドを鳴らす
   -SpeakHitMessage "文字列"
         ヒットした際にしゃべらせる文字列
         voice List is
                Microsoft Haruka Desktop(ja-JP)
                Microsoft Zira Desktop(en-US)
(/U モードでも、検索文字列は必須です)



削除方法
レジストリや、システムフォルダはいじっていないので、
解凍してできたファイルを削除すればOKです


免責など
著作権は一応、保持します。
このソフトを使用したことによって生じた、
いかなる損害についても責任は持ちません。
ソースコードについても、各自の責任において、
自由にいじってくれてもいいです。

ver2.5から 修正BSDライセンスで配布します。


DownLoad(find.lzh as 53,761byte) (find.lzh.base64)

Qiita に記事を書いた
find.exe の代替としての find.net.exe(find.net2.exe/find.net4.exe)


mail to active@window.goukaku.com