複数ファイルにマクロ実行No.03561
安久津 さん 03/02/02 14:17
 
あくつです。

(1)複数ファイルに対してマクロを実行。
  「複数ファイルに対して、ある置換を行いたい」ということが、たまに話題
   になります。一般的には、「複数ファイルに対してマクロを実行したい」と
   すれば、応用が効きそうです。思い浮かべているのは印刷です。

    注意。
        以下では、プロセスの終了を待つので、予め常駐秀丸が存在している必
        要があります。そうでないと、起動された常駐秀丸の終了を待ってし
        まいます。

(2) マクロ
    // 以下のマクロを例として使います。
    // このマクロは、秀丸マクロディレクトリに置きます。
    // date.mac
    gofiletop;
    insert date + " " + time + "\n";
    saveexit;

(3) Bash から実行。

$ cat ~/bin/execmacro
#!/usr/bin/bash
if [ $# -lt 2 ]; then
    echo "Usage:" >&2
    echo "execmacro macroname.mac a.txt b.txt c.txt" >&2
    echo "execmacro macroname.mac *.txt *.log" >&2
    exit 1
fi
macro=$1
shift
dir=$(cygpath -w $(pwd))
while [ $# -gt 0 ]; do
    if [ -f "$1" ]; then
        echo $dir\\$1
        /cygdrive/c/progra~1/hidemaru/hidemaru.exe /x $macro /h $dir\\$1
    fi
    shift
done
exit 0

$ execmacro date.mac *.txt
C:\cygwin\home\ta\b.txt
C:\cygwin\home\ta\contain space.txt
$ head -1 b.txt
03/02/02(日) 12:25:48
$ execmacro
Usage:
execmacro macroname.mac a.txt b.txt c.txt
execmacro macroname.mac *.txt *.log
$ exit

(4) Ruby から実行。

> cd
c:\windows\command
> type execmacro.rb

    if ARGV.length < 2
tmp =<<'EOD'
Usage:
ruby -S execmacro.rb macroname.mac a.txt b.txt c.txt
ruby -S execmacro.rb macroname.mac *.txt *.log
execmacro macroname.mac a.txt b.txt c.txt
execmacro macroname.mac *.txt *.log
EOD
        $stderr.print tmp
        exit 1
    end

    hidemaru = 'c:\progra~1\hidemaru\hidemaru.exe'
    macro = ARGV.shift
    hidemaru = "#{hidemaru} /x #{macro}"

    fname = nil
    ARGV.each{ |fname|
        next unless FileTest.file?( fname )
        puts fname
        #ruby の場合 /h で起動すると終了を検知できない。
        #unless system "#{hidemaru} /h #{fname}"
        unless system "#{hidemaru} /(0,0,200,200) #{fname}"
            $stderr.puts "Failed: #{fname}"
            exit 1
        end
    }
exit 0

> type execmacro.bat
@echo off
ruby -S execmacro.rb %1 %2 %3 %4 %5 %6 %7 %8 %9

> cd "C:\My Documents"
> execmacro a.mac *.txt *.log abc*.c


(5) 備考。
    (A)上記で呼び出せるマクロは、exit, saveexit, saveallexit 等で終了
       しなければならない。

    (B)秀丸のマクロコマンド execmacro が、ワイルドカードを第2引数に取れるよう
       になっていると便利かも。grep コマンドみたいなヤツ。
       execmacro "date.mac", "*.txt;*.log";
       forkmacro "date.mac", "*.txt;*.log";

    (C)WSH でやろうとしたら、ワイルドカードの展開方法が分からなかった。(^^;)
       glob みたいなものもないし。

    (D)DOS コマンドでやろうとしたら、秀丸の終了を待ってくれないので、
       「他の秀丸が実行中です」が沢山表示されてダメでした。
        上記の date.mac なら平気ですが、ちょっと時間のかかる処理だと
        発覚します。

// a.mac
    gofiletop;
    insert date + " " + time + " wait ?\n";
    ##t = tickcount + 2000;
    while( tickcount < ##t ){
        ##i = 1;
    }
saveexit;

// 以下一行。
C:\My Documents>for %f in (*.txt,*.log) do c:\progra~1\hidemaru\hidemaru.exe
 /x a.mac /h %f

[ ]
RE:03561 複数ファイルにマクロ実行No.03562
安久津 さん 03/02/02 17:57
 
WSH で書いてみました。
途中で、Run("command.com /c dir ...") をやっているところがカッチョ悪いですが。
# しかし、WSH って面倒くさい。

> cd
c:\windows\command
> type execmacro.js

    if( WScript.Arguments.length < 2 ){
        WScript.Echo("Usage:");
        WScript.Echo("execmacro macroname.mac a.txt b.txt c.txt");
        WScript.Echo("execmacro macroname.mac *.txt *.log");
        WScript.Quit(1);
    }

    var hidemaru = "c:\\progra~1\\hidemaru\\hidemaru.exe";
    var wshell = new ActiveXObject("WScript.Shell");
    var fso = new ActiveXObject("Scripting.FileSystemObject");
    var tmpfname = fso.GetTempName();
    var macro = WScript.Arguments.item(0);
    var size = WScript.Arguments.length;
    var ret=0;
    for( var i = 1; i < size; i++ ){
        ret = wshell.Run("command.com /c dir /on/b " + WScript.Arguments.ite
m(i) + " >>" + tmpfname, 1, true);
        if( ret != 0 ){
            WScript.Echo("Failed: " + WScript.Arguments.item(i));
            WScript.Quit(1);
        }
    }

    var fin=null;
    try{
        fin = fso.OpenTextFile(tmpfname, 1, false);
    }catch( ex ){
        WScript.Echo( ex.description );
        WScript.Quit(1);
    }
    hidemaru = hidemaru + " /x " + macro;
    var fname;
    while( ! fin.AtEndOfStream ){
        fname = fin.ReadLine(); // chomp
        if( fso.FileExists( fname ) ){
            ret = wshell.Run(hidemaru + " /h " + fname, 1, true);
            // iconized, no activated, 上手く行かない。
            //ret = wshell.Run(hidemaru + " " + fname, 7, true);
            if( ret != 0 ){
                WScript.Echo("Failed: " + WScript.Arguments.item(i));
                break;
            }
            WScript.Echo( fname );
        }
    }
    fin.Close();
    fin=null;
    fso.DeleteFile(tmpfname);
    wshell=fso=null;

WScript.Quit(ret);

> type execmacro.bat
@echo off
rem ruby -S execmacro.rb %1 %2 %3 %4 %5 %6 %7 %8 %9
cscript //nologo c:\windows\command\execmacro.js %1 %2 %3 %4 %5 %6 %7 %8 %9

> cd "C:\My Documents"
> execmacro a.mac *.txt *.log abc*.c

[ ]
RE:03562 複数ファイルにマクロ実行No.03563
安久津 さん 03/02/02 18:22
 
--- 前の投稿の execmacro.js
+++ 新しい     execmacro.js
@@ -37,7 +37,7 @@
             // iconized, no activated, 上手く行かない。
             //ret = wshell.Run(hidemaru + " " + fname, 7, true);
             if( ret != 0 ){
-                WScript.Echo("Failed: " + WScript.Arguments.item(i));
+                WScript.Echo("Failed: " + fname);
                 break;
             }
             WScript.Echo( fname );

[ ]
RE:03561 複数ファイルにマクロ実行No.03564
ひろ さん 03/02/02 22:25
 
 安久津さん今日は、ひろです。
> (1)複数ファイルに対してマクロを実行。
 このためのマクロを既にライブラリに公開済みです。

[ ]
RE:03564 複数ファイルにマクロ実行No.03565
安久津 さん 03/02/03 14:21
 
こんにちは、あくつです。

>> (1)複数ファイルに対してマクロを実行。
> このためのマクロを既にライブラリに公開済みです
ダウンロードしました。# 一行説明が、03561 の題名と同じですね。(^^;)

実際に使ってみました。

気づいたところ。
(1)batchmac1.mac の最初の方にある変数 $execmacro は、
   どこで初期化されているのでしょうか。
   これって、$macro の typo かも。

(2)強調表示ファイルのロードに失敗のメッセージが繰り返しでます。
   私の環境が bregex.dll, bregif.dll の環境だからかなと思ったのですが、
   searchEx\OpenFile.mac にある
    $hilight = getinistr($ini,"SEARCH","block");
   では、$hilight は空です。
    searchEx\searchEx.ini の [SEARCH] セクションの block が
   存在しません。

では。

[ ]
RE:03565 複数ファイルにマクロ実行No.03566
ひろ さん 03/02/03 17:52
 
 安久津さん今日は、ひろです。
>    これって、$macro の typo かも。
 仰るとおりです(^^;。
 ##場合によっては無限ループになっていた。

>    searchEx\OpenFile.mac にある
>     $hilight = getinistr($ini,"SEARCH","block");
>    では、$hilight は空です。
>     searchEx\searchEx.ini の [SEARCH] セクションの block が
>    存在しません。
 このマクロでは関係ない部分なのに、他のマクロとの関係で、例外処理にす
ることを忘れていました。

 どうもご指摘ありがとございました。

[ ]
RE:03561 複数ファイルにマクロ実行No.03567
encodingshiftjis さん 03/02/03 22:59
 
Start.exe  のオプションは有効のはずですが? だめかな

C:\My Documents>for %f in (*.txt,*.log) do START/W c:\progra~1\hidemaru\hide
maru.exe /x a.mac /h %f

[ ]
RE:03567 複数ファイルにマクロ実行No.03568
安久津 さん 03/02/04 16:49
 
こんにちは、あくつです。

> Start.exe  のオプションは有効のはずですが? だめかな
>
> C:\My Documents>for %f in (*.txt,*.log) do START/W c:\progra~1\hidemaru\hide
> maru.exe /x a.mac /h %f

使えました。# しらんかった。今までなんだったんだ。(^^;)

では。

[ ]
RE:03568 複数ファイルにマクロ実行No.03569
安久津 さん 03/02/04 21:16
 
rem ------------------------------------------------------------------
rem execmacro.bat
@echo off
rem 機種依存部分。
if "%hm_hidemarudir%" == "" set hm_hidemarudir=c:\progra~1\hidemaru
if "%hm_macrodir%" == "" set hm_macrodir=c:\progra~1\hidemaru\macro
rem 非常駐対策用。
rem 必ずしも、秀丸を常駐させていない人は、以下の1行を有効にして
rem quit.mac を作成して下さい。# quit.mac の中は、quit; だけ。
rem if "%hm_quit%" == "" set hm_quit=quit.mac
rem ------------------------------------------------------------------
set hm_macro=
set hm_currentmacrobasename=
set hm_opts=

if "%1" == "/x" shift
if "%1" == "" goto noexpand
if "%1" == "--help" goto help
if "%1" == "/?" goto help
set hm_macro=/x %1
set hm_currentmacrobasename=%1
shift

rem 非常駐対策。 start /m の m が効かないので /(0 0 100 100)
if exist "%hm_macrodir%\%hm_quit%" start /m %hm_hidemarudir%\hidemaru.exe /x
 %hm_quit% /(0,0,100,100)

:getopts
rem /x は無し。
if "%1" == "/x" shift
if "%1" == "--" goto expand
if "%1" == "//" goto expand
if "%1" == "" goto noexpand
set hm_opts=%hm_opts% %1
shift
goto getopts

:expand
shift
if "%1" == "" goto end
@echo on
for %%f in (%1) do start /w %hm_hidemarudir%\hidemaru.exe %hm_macro% %hm_opt
s% %%f
@echo off
goto expand

:noexpand
%hm_hidemarudir%\hidemaru.exe %hm_macro% %hm_opts%
goto end

:help
echo  Author:      T Akutsu  xxxxxxx@mbd.sphere.ne.jp
echo  Description: 秀丸マクロ実行用バッチファイル。
echo               主にワイルドカードなどで指定される複数のファイルに
echo               対して、一つのマクロを実行させる用途に使う。
echo  Note:        このバッチファイルから利用されるマクロは、
echo               exit, saveexit, saveexitall, quit, などで終了する必要
echo               があります。
echo  Bugs:        常駐秀丸v3.17 が存在しないとカレントディレクトリを間違える。
echo  Usage:
echo    execmacro a.mac [options] afile
echo    execmacro a.mac [options] [--] [files]
echo    execmacro a.mac [options] [//] [files]
echo    execmacro /? or --help

echo               `--' と `//' は、オプション終了の印です。
echo               1つのファイルを指定するときは `--' はいらない。
echo               複数のファイルを指定するときは `--' は必須です。
echo    [1つのファイル]
echo      execmacro a.mac /h a.txt
echo      execmacro a.mac /fj a.txt
echo    [複数のファイル]
echo      execmacro a.mac /h -- a.txt b.txt c.txt
echo      execmacro a.mac -- *.txt *.log *.h
echo      execmacro a.mac /h /fe -- hoge?.log
goto end

:end
set hm_macro=
set hm_currentmacrobasename=
set hm_opts=

[ ]
RE:03569 複数ファイルにマクロ実行No.03570
安久津 さん 03/02/04 22:28
 
execmacro.bat の使い方。

●(1)execmacro.bat を保存する。

    execmacro.bat の保存場所はパスの通っているところならどこでもよい。
    通常は、
    c:\windows\command\execmacro.bat
    です。

●(2)execmacro.bat の環境依存部分を書き換える。

    通常は、

rem 機種依存部分。 # 環境だったな。(^^;)
if "%hm_hidemarudir%" == "" set hm_hidemarudir=c:\progra~1\hidemaru

    の部分を書き換えるだけで OK。
    空白を含む場合は 短縮ディレクトリ名にしてください。

●(3) 文字コード変換用マクロ

    秀丸マクロフォルダに、以下の4つのマクロを置いておく。

// sjis.mac
    saveas basename2, sjis;
    if( getenv("hm_currentmacrobasename")==currentmacrobasename ){
        exit;
    }
endmacro;
// end of sjis.mac

// euc.mac
    saveas basename2, euc, lf;
    if( getenv("hm_currentmacrobasename")==currentmacrobasename ){
        exit;
    }
endmacro;
// end of euc.mac

// jis.mac
    saveas basename2, jis, lf;
    if( getenv("hm_currentmacrobasename")==currentmacrobasename ){
        exit;
    }
endmacro;
// end of jis.mac

// utf8.mac
    saveas basename2, utf8;
    if( getenv("hm_currentmacrobasename")==currentmacrobasename ){
        exit;
    }
endmacro;
// end of utf8.mac

●(4) コマンドラインで文字コード変換。

C:\foo>execmacro sjis.mac a.txt                      (A)
C:\foo>execmacro euc.mac /fs -- *.txt                (B)
C:\foo>execmacro utf8.mac /(0,0,200,200) -- *.txt    (C)
C:\foo>execmacro jis.mac /fu8 /h -- *.txt            (D)

(A) a.txt を秀丸の自動判別で開いて、sjis で保存する。
(B) カレントディレクトリにある *.txt のファイルを、sjis として開いて、
    euc で保存する。
(C) カレントディレクトリにある *.txt のファイルを、秀丸の自動判別で
    開いて、utf8 で保存する。ウインドウは、小さめにする。
(D) カレントディレクトリにある *.txt のファイルを、utf8 として開いて、
    jis で保存する。ウインドウは隠す。( でもちょっと見えてしまう )


/(0,0,200,200) をデフォルトにしているといい感じ。


[ ]