【VBScript】サクラエディタをより便利に:連続GREP

この記事は約12分で読めます。

Grep検索使ってますか?

システム開発していると、無いと仕事にならないレベルで、必須機能です。
そもそもGrepって何?って人の為に、軽く説明するとこんな感じのモノ!

通常の検索機能を強化したモノ
複数ファイル の中から『xxx』(キーワード)に該当する場所を、 一気に検索できる!

  • テキストエディタ(秀丸エディタやVSCodeなど)
  • 統合開発環境(EclipseやVisualStudioなど)

このようなアプリケーションには、基本的に搭載されてますね!

今回はサクラエディタの 『Grep機能の紹介』『ちょっとした不満を解消するツールを紹介!』

この記事の著者
のら

お家大好きSE

soratsm

プロフィール

都内で働くシステムエンジニア
素早く家に帰るために日々技術を磨いています。
学んだ技術をわかりやすく紹介します! プロフィール詳細

スポンサーリンク

便利な機能:Grepによる複数ファイル検索

サクラエディタを開いて『Ctrl + G』を押しましょう。
すると下のよう画面が開きます。

この中の『検索キーワード』『対象ファイルの条件』『検索対象のフォルダ』を入力します。

/* ★目次カスタマイズ開始★ */ .toc{   display: block;   padding: 0px;   margin-bottom: 40px;   margin-left: 5%;   margin-right: 5%;   border: none;   color: #FCAA00; }  .toc-title{   position: relative;   padding: 10px 0;   background: #757575;   color: #fff;   font-weight: bold; }  .toc .toc-content{   padding: 15px;   background-color:#EFEFEF; }

『検索』ボタンを押して、Grep検索終わった結果がこんな感じ。

この条件で検索した結果は、このファイルのこの行に当たりがありますねー

って感じで表示してくれます。

Grep結果。該当ファイルと該当行がすべて表示される

該当行はわかったからその周辺も見たいって場合は、その行をダブルクリックして下さい。

見つかったファイルの、その行に飛んでくれます!

Grep結果からダブルクリックで対象ファイルにジャンプできる

更に一歩:【タグジャンプ】でGrep結果⇔該当箇所も簡単移動

ここまででも、初めて知ったときは 『便利!』 って、昔思いました…(遠い目)

ここでは更にソース追うのが、 3倍ぐらい早くなるショートカットキー を是非覚えておいてほしいです!

それがタグジャンプと呼ばれる機能!

Grep結果で『F12』 ⇔ 該当ファイルで『Shift +F12』

この2つで、マウスを使わず行ったり来たりできる!

『F12』と『Shift + F12』で行ったり来たりできる為、効率的

問題点:何度も実行するのが面倒

ここまで、便利!っておすすめしましたが、僕には一つ不満があるのです。

見出しにもある通り、 何度も実行するのが、面倒くさいんですよ!

4,5回ぐらいだったら全然許容範囲なんですけどねー

システム開発という仕事柄、修正影響の調査や類似不具合の調査なんかで、10回20回とやる時があるんです。
その時は一回一回の待ち時間が苦痛で…そしてそれらをエビデンスとして残したいなんてなると…
思わず席を立って、軽く休憩しちゃいます(笑)

まぁそんな不満を解消するためにVBScriptでツールを作った次第です。

同じ悩みを抱えてる人の役に立てれば嬉しいです!

コード:Grepを並列実行&ファイル出力

'★★設定項目 開始★★
'ココは自分のパソコンのexeファイルが場所に書き換える
'フォルダ名が半角スペース入っている場合は、『""xx xx""』とする。
Const SakuraPath = "C:\""Program Files""\sakura\sakura.exe"
'★★設定項目 終了★★

Call JudgeDDFile

'ドラッグ&ドロップされたファイルの判定
Sub JudgeDDFile()
    Dim objArgs , objFSO , objFiles , ddFile
    Set objArgs = WScript.Arguments
    Set objFSO = CreateObject("Scripting.FileSystemObject")

    'ファイル数判定
    Select Case objArgs.Count
        Case 0
            MsgBox "Grep対象をD&Dしてください"
        Case 1
            ddFile = WScript.Arguments(0)
            Set objFiles = objFSO.GetFile(ddFile)

            'ファイル拡張子判定
            If objFSO.GetExtensionName(ddFile) = "txt" then
                vret = MsgBox("このtxtファイル(" & objFiles.name & ")を基にGrepを実行しますか?",vbokcancel)
                If vret = vbok then
                    '連続Grep処理
                    Call MultiGrep(objFiles)  
                Else
                    MsgBox "中止しました"
                End If
            Else
                MsgBox "ドロップしたファイルは(" & objFiles.name & ")",,"txtファイルをD&Dして下さい"
            End If

            Set objFiles = Nothing
        Case Else
            MsgBox "1ファイルのみD&Dして下さい"
    End Select

    Set objArgs = Nothing   
    Set objFSO = Nothing   
    WScript.Quit
End Sub

'連続Grep処理
Sub MultiGrep(objFiles)
    Dim fso , tso , flds , i
    Dim stringNow , inputPath
    rowNo = 0

    Set fso = CreateObject("Scripting.FileSystemObject")
    '読み取り専用で開く
    Set tso = fso.OpenTextFile(objFiles, 1)

    'ファイル名をユニークにする為、年月日日時取得
    stringNow = GetNow

    '入力ファイルと同じ階層に出力する為に、入力ファイルのパスを取得
    inputPath = fso.getParentFolderName(objFiles)
    
    '入力ファイルの行数分ループ
    While tso.AtEndOfStream <> true
        flds = Split(tso.ReadLine, vbTab)
        rowNo = rowNo + 1
        '"-GKEY【タブ】-GFILE【タブ】-GFOLDER"の形式
        If UBound(flds) = 2 Then
            Call RunGrepCmd(flds , inputPath , rowNo , stringNow)
        End If
    Wend
    tso.Close
    Set fso = Nothing
End Sub

'サクラエディタのGrepコマンドを実行
Sub RunGrepCmd(flds , inputPath , rowNo , stringNow)
    Dim rowNo2 , grepCmd , objShell

    '桁数を揃えるために行番号を2桁に揃える
    If rowNo < 10 Then
        rowNo2 = "0" & rowNo
    Else
        rowNo2 = rowNo
    End If

    'コマンドラインに流す為、Grepコマンドを生成
    grepCmd = "cmd /c " & SakuraPath & " -GREPMODE -GKEY=""" 
    grepCmd = grepCmd & flds(0)
    grepCmd = grepCmd & """ -GFILE="""
    grepCmd = grepCmd & flds(1)
    grepCmd = grepCmd & """ -GFOLDER="""
    grepCmd = grepCmd & flds(2)
    grepCmd = grepCmd & """ -GOPT:""SRPU"" > "
    grepCmd = grepCmd & inputPath & "\Grep結果" & stringNow & "_row" & rowNo2 & ".txt"

    'コマンド実行
    Set objShell = CreateObject("WScript.Shell")
    objShell.Run grepCmd,0,false
    Set objShell = Nothing
End Sub

'年月日日時を取得
Function GetNow()
    Dim w_Now
    Dim w_Month
    Dim w_Day

    '年取得
    w_Now = ""
    w_Now = Year(Now())

    '月取得(二桁で揃える)
    w_Month = Month(Now())
    If w_Month < 10 Then
        w_Now = w_Now & "0" & w_Month
    Else
        w_Now = w_Now & w_Month
    End If

    '日取得(二桁で揃える)
    w_Day = Day(Now())
    If w_Day < 10 Then
        w_Now = w_Now & "0" & w_Day
    Else
        w_Now = w_Now & w_Day
    End If

    '時分秒取得
    w_Now = w_Now & Right("0" & Hour(Now()) , 2)
    w_Now = w_Now & Right("0" & Minute(Now()) , 2)
    w_Now = w_Now & Right("0" & Second(Now()) , 2)

    getNow = w_Now
End Function

これをコピペして適当なファイル名で拡張子vbsで保存して下さい。
(『xxx.vbs』こんな感じ)

もし作り方がわからなければ、この記事に詳しく書いてあるので、わからなかったら参照して!

解説

サクラエディタのexeファイルの場所を指定(4行目)

ここは使う人それぞれが、自分のパソコンにインストールしたサクラエディタの場所に書き換えて下さい!

ポイントは『""Program Files""』の部分です。
パスを指定している 途中に半角スペースがあるとうまく実行できないので、ダブルクォーテーションで囲んで上げる 必要があります。

実行した結果出力されたファイルに何も表示されていなかったら、ここの指定がうまく行ってないと思って下さい。

ファイル数判定(15~39行目)

今回はやりたいことがGrepだったので、この辺が毎回変わります。

  • 検索したい文字列【GKEY】
  • どんなファイルを対象とするか【GFILE】
  • どこのフォルダ配下を対象とするか【GFOLDER】

そのため、入力ファイルに実行する際に作って、 ドラッグ&ドロップで起動するようにしています。
(詳しくは次の『使い方』で説明しますが、作ると言ってもすごく簡単です。)

コマンド作成と実行(86~99行目)

連続実行のキモの部分です。

サクラエディタのコマンドラインオプションで、Grepの実行と結果の保存を行います。

入力ファイルから受け取った情報を基に、コマンドを作ります。
(grepCmdというのが8行続いてる部分ですね!)

結果としてこんな感じのが出来上がります。

cmd /c C:\"Program Files"\sakura\sakura.exe -GREPMODE -GKEY="【キーワード】" -GFILE="【対象ファイル】" -GFOLDER="【対象フォルダ】" -GOPT:"SRPU" > 【入力ファイルのパス】\Grep結果【実行年月日日時】_row【入力ファイルの何行目】.txt

コレをコマンドラインと呼ばれるモノに送って、入力ファイルの行数分Grepが実行されるわけです。

objShell.Run grepCmd,0,false

このタイミングで実行されるわけですね。(98行目)
ツール作るときにVBScriptだけでやろうとせずに、こんな感じで 他のツールと連携すると楽 になったりします。

コマンドが想定通りか、msgBoxで確認したりも良くしますね!

Runメソッドは少しだけ奥が深いですが、『最低限これだけ覚えておくといいよ!』という補足情報載せておきます。

◆『runメソッド』と『execメソッド』の違い

上記の『Run』の部分を『Exec』と変えても実行できます。

コマンドラインで実行するという意味では2つとも共通ですが、最大の違いは結果を受け取れるかどうか です。
『Run』は受け取れないので、そういう場合は『Exec』を使いましょう!

◆後ろについてる『0,false』

  • 『0』はコマンドライン画面(黒い画面ですね)を表示させないという意味
  • 『false』は実行結果を待つかどうか

今回の場合は、裏でどんどん実行してもらいたいのでこの設定です。

もし、『画面表示させつつ、1回終わって次を実行』みたいなのを作る場合は、ここを見直して下さい。

使い方

入力ファイルを作る

入力ファイルは『-GKEY【タブ】-GFILE【タブ】-GFOLDER』の形式で作って下さい。
具体的にはこんな感じ

\d{6}	*.txt	D:\Shortcut  
ワード	*.*	D:\GoogleDrive

作り方はExcelなどで、A列:キーワード/B列:ファイル/C列:フォルダで3項目をザーっと設定

A列:キーワード B列:ファイル C列:フォルダ

これをコピーして、サクラエディタなどに貼れば、上の形式になっているのでOK!
後は適当な場所に『.txt』形式で保存

テキストエディタにコピペで完成

入力ファイルをツールにドラッグ&ドロップ

作った入力ファイルをドラッグ&ドロップして、出てきたダイアログで『OK』押せば実行始まります。

ドラッグ&ドロップで実行

入力ファイルと同じ場所にGrep結果が出力

VBScriptの場所でなく、入力ファイルの場所に出力するようになってます。

特徴としては

  • 名前が毎回必ず変わるので、上書きされることがない
  • タブが2つ無いとその行はスルーされるので、コメントを入力ファイルに書くこと可能

最後に

最後まで見ていただきありがとうございます!

これを使って見て、一瞬でも 『楽だ』 と感じてもらえたら嬉しい限りです。

ツール作成はレゴみたいな感じで、いろんな部品を拾い集めて形にしていく作業です。
思い描いていたものが完成したときは達成感があるんですよねー♪

この楽しさも含めて知ってもらえたら、より嬉しく思います!

今回使った部品について、記事書いているので良かったら見てみて下さい。

プログラミングやツール作成にチャレンジしてみたい方は、自分や友達の『この作業毎回やるの面倒くさい…』をヒヤリングしてみると、題材が見つかると思いますよ。

質問等あればコメント欄に記載お願いします。

いじょー!!

タイトルとURLをコピーしました