エディタ側でのマクロについてNo.09715
もみじ さん 22/06/01 20:08
 
いつもお世話になります。

以下、期待した動作ではないように思いますのでご確認お願いいたします。

手順
1.秀丸メール側でマクロを登録
2.その際、「エディタ側」で「秀丸メール側で指定する」を選択し「秀丸メール本体
と同期」を実施
これにより、新規メール作成時の秀丸エディタ側メニューのマクロからは上記で登録
したマクロが表示選択可能となる。
3.「検索して一覧作成」で適当なメールを表示する
4. 一覧表示されたメールの右クリックで「マクロ実行」を選択すると、上記2を行
う前のマクロ名が表示され、2の同期が反映されていない。

以上です。

[ ]
RE:09715 エディタ側でのマクロについてNo.09724
秀まるお2 さん 22/06/02 10:14
 
 すみませんが再現がうまくいかないです。再現の手順が大変面倒なので、たぶん何
か手順が違ってるんだと思います。

 とりあえずこちらでテストしたやり方を書くので、どこがどう違うのか教えてほし
いです。

 1.秀丸メール本体ウィンドウ上で「マクロ - マクロ登録...」を実行する。

  「秀丸メール本体側」のマクロ1に「test(本体側)」ってタイトルにて「test.ma
c」を登録する。
  「エディタ側」の所の「秀丸メール側で指定する」にして、「test(エディタ
側)」ってタイトルで登録する。

 2.一回OKして再起動する。

 3.とりあえずここで確認テストとして、「検索して一覧作成」を実行して結果の
メール一覧上で
   マウス右ボタンを押して、そのメニューの一番下にある

    すべてのコマンドを表示(\)

   を選択する。そうすると右ボタンメニューがもう一度出てきて、そこに

    マクロ(X)

   のサブメニューが出てくるそれの上にマウスカーソルを載せてその配下のメニ
ューを見ると、

    マクロ実行(X)...
    --------------------------------
    test(本体側)

   のように出てくる。これはこれで正しい動作だと思う。

 4.「マクロ - マクロ登録...」の「エディタ側」で「秀丸メール本体と同期」ボ
タンを押して
   OKする。

 5.「3」のテストをもう一度やる。結果同じ。

 で再現せずというか、そもそも的に検索結果のマウス右ボタンメニューに「test
(エディタ側)」が出てくることが無いので、再現のしようが無いです。

[ ]
RE:09724 エディタ側でのマクロについてNo.09727
もみじ さん 22/06/02 11:15
 
基本は書いて頂いたものと同じなのですが、秀丸エディタの方もからむのでちょっと
文書での説明が
難しく、再現ビデオを取りました。
サイズが11Mあります。
よろしければメールでダウンロードするURLをお送りさせて頂きますが如何でしょうか?

> で再現せずというか、そもそも的に検索結果のマウス右ボタンメニューに「test
>(エディタ側)」が出てくることが無いので、再現の
しようが無いです。

となると、もしかして私の機能についての理解が全く違うのかも知れませんね、、、、
その場合は大変申し訳ありません。



> すみませんが再現がうまくいかないです。再現の手順が大変面倒なので、たぶん
>何か手順が違ってるんだと思います。
> ......
> で再現せずというか、そもそも的に検索結果のマウス右ボタンメニューに「test
>(エディタ側)」が出てくることが無いので、再現のしようが無いです。

[ ]
RE:09727 エディタ側でのマクロについてNo.09729
秀まるお2 さん 22/06/02 11:47
 
> よろしければメールでダウンロードするURLをお送りさせて頂きますが如何でしょ
>うか?

 ここに書き込んでいただいてもいいですが、僕以外に見られたくない場合は、"mar
uo@mitene.or.jp"宛てにメールで送ってほしいです。

 YouTubeに「URLを知ってる人にのみ公開」みたいな設定でアップロードしてもらえ
ればいいんだろうと思いますけども。

 よろしくお願いします。

[ ]
RE:09729 エディタ側でのマクロについてNo.09732
もみじ さん 22/06/02 12:13
 
先ほどメールしましたのでご検討方よろしくお願いいたします。

事象としては、秀丸メール内で登録したマクロがツールバーの
マクロの所からはそのマクロが選択できるが、メール右クリック
メニューからはそのマクロが出てこずに秀丸メールの方のマクロが
表示されているというものになります。

私の理解では、どちらでも秀丸メールに登録のマクロが出てくるのではと思っていま
す。


[ ]
RE:09732 エディタ側でのマクロについてNo.09733
秀まるお2 さん 22/06/02 14:42
 
 動画見ましたが、何かがおかしいのか分からずでした。たぶん仕様を誤解されてる
んだろうと思います。

 「マクロ実行...」のコマンドを実行して出てくるリストですが、このリストは、
単純に、マクロ用に指定されたフォルダにある「*.mac」をリストアップしてるだけ
です。なので、ここの一覧は「マクロ登録・エディタ側」などの設定とはまったく関
係無いです。

 「マクロ登録・エディタ側」の設定は、エディタ・ウィンドウの「マクロ」メニ
ューの中に出てくるメニューをカスタマイズする物です。

 それともう1つ、「マクロ実行...」で出てくるダイアログボックスは、秀丸エデ
ィタの動作環境の「環境 - 高度な環境」の所で指定できまして、最近の秀丸エディ
タではそこが「参照ダイアログ」になってます。(新規インストールするとそうなの)

 「参照ダイアログ」だと普通の「開く」ダイアログと同じようなデザインになりま
す。こっちの方がわかりやすいと思うというか、仕様を誤解されないと思います。

[ ]
RE:09733 エディタ側でのマクロについてNo.09734
もみじ さん 22/06/02 15:13
 
ご確認ありがとうございます。

> 「マクロ実行...」のコマンドを実行して出てくるリストですが、このリストは、
>単純に、マクロ用に指定されたフォルダにある「*.mac」をリストアップしてるだけ
>です。なので、ここの一覧は「マクロ登録・エディタ側」などの設定とはまったく
>関係無いです。

そうだったんですね。
てっきり、「マクロ」メニューの中に出てくるメニューと同じものがでてくるのでは
と考えていました。

> 「参照ダイアログ」だと普通の「開く」ダイアログと同じようなデザインになり
>ます。こっちの方がわかりやすいと思うというか、仕様を誤解されないと思います。

現状、「標準」になっていたので、「参照ダイアログ」に変更しました。
こちらだと確かに私みたいな誤解はしにくいですね。

ということで、大変失礼いたしました。
私の仕様誤認識でした。

[ ]
RE:09724 エディタ側でのマクロについてNo.09748
さかみつ さん 22/06/06 14:01
 
横からすみません。

パスワード別便メールをよくもらうのですが、送り忘れでパスワードメールが後日届
いたり
することがあります。
日常的に沢山メールが届くので、その場合、本文メールのタイトルとかをキーにして
パスワードメールを探し、秀まるおさん作成のパスワード付きZipの簡単解凍V1.8(Pa
sswordZipExtract.mac)で
解凍しようとするのですが、右クリからのメニューのマクロ実行からマクロを指定す
るのが手間に思っています。
メニューのマクロに登録した名称を右クリメニューにも出して頂けないでしょうか。


「パスワード付きZipの簡単解凍V1.8(PasswordZipExtract.mac)」なのですが、
次のようなパスワードメールの場合、このマクロではうまく動作しませんでした。

>先ほどお送りしたメールのパスワードをお知らせいたします。
>
>WdVj7eui
>
>どうぞよろしくお願いいたします。

こちらも対応できると嬉しいです。

色々横からすみません




> すみませんが再現がうまくいかないです。再現の手順が大変面倒なので、たぶん
>何か手順が違ってるんだと思います。
> ......
> で再現せずというか、そもそも的に検索結果のマウス右ボタンメニューに「test
>(エディタ側)」が出てくることが無いので、再現のしようが無いです。

[ ]
RE:09748 エディタ側でのマクロについてNo.09750
秀まるお2 さん 22/06/06 16:16
 
 右クリックメニューからマクロを呼び出す方法は一応現在もありますが、「マクロ
登録」の所とは別の所に設定があります。

 「設定 - 全般的な設定...」の「メール一覧 - 右ボタンメニュー」のページにあ
ります。そこの一覧に

 マクロ1: ....
 マクロ2: ....

 みたいに登録したマクロが出てくるはずなので、それの必要なののチェックをONに
すればいいです。

> >先ほどお送りしたメールのパスワードをお知らせいたします。
> >
> >WdVj7eui

 この文面って、ユーザーさんが手作業で書いてる文面のような気がしないでもない
ですが、毎回たしかにこの文面固定なのでしょうか。

 固定じゃないとしたら、ちょっと対応が難しいんですが、とりあえず、「パスワー
ドをお知らせ」を含む行があったらその後ろからパスワードを探すような処理にして
みようかなぁと思います。

 後でまたコメント発言させていただきます。

[ ]
RE:09750 エディタ側でのマクロについてNo.09753
さかみつ さん 22/06/06 17:15
 
> 右クリックメニューからマクロを呼び出す方法は一応現在もありますが、「マク
>ロ登録」の所とは別の所に設定があります。

ありがとうございます。
そのような機能があるのを知りませんでした。
助かりました。

> この文面って、ユーザーさんが手作業で書いてる文面のような気がしないでもな
>いですが、毎回たしかにこの文面固定なのでしょうか。

手作業です。
実際、このように手作業で送ってくる人も結構いまして、できれば、”パスワード”
もしくは"PW"のキーワードの後の
数行の間に、それらしい文字列があれば候補にする、などができればたいていの場合
はいけるんじゃないかと思います。

お願いばかりですみません。


> 右クリックメニューからマクロを呼び出す方法は一応現在もありますが、「マク
>ロ登録」の所とは別の所に設定があります。
> ......
> 後でまたコメント発言させていただきます。

[ ]
RE:09753 エディタ側でのマクロについてNo.09754
秀まるお2 さん 22/06/06 18:54
 
 2種類の対策をしてみました。

 まず、「パスワード」って単語を含む日本語の文字列だけの行があって、その次の
何らかの文字列を含む行にパスワードらしき物があったらそれを拾うようにしてみま
した。

 さらに、パスワードを範囲選択して実行したら、その範囲選択文字列をパスワード
として使って解凍するようにしてみました。

 マクロの中身を以下のようにしてテストしてみてほしいです。


//暗号化Zipの自動解凍 PasswordZipExtract.mac
// 2019.02.12
// 2019.03.07 Version 1.1 パスワードの形式追加。
// 2019.03.12 Version 1.2 パスワードの形式さらに追加。
// 2021.04.26 Version 1.3
//            7-Zipの代わりにunzip.exeでも解凍できるようにした。
//            パスワードの形式にもっといろいろ追加。&、複数候補あった場合は
メニュー表示するようにした。
// 2021.05.10 Version 1.4 さらに形式追加。11〜12
//            unzip.exeまたは7zip.exeの終了コードを見て、成功してる場合は結
果表示しないようにした。
// 2021.05.11 Version 1.5 PasswordZipTempフォルダにサブフォルダのゴミが残る
バグ修正。
// 2021.05.13 Version 1.6 メール本文にユニコード文字(Shift-JIS範囲外の文
字)があるとパスワードがおかしくなるバグ修正。
// 2021.05.18 Version 1.7  パスワードの中に「%」があると失敗するバグ修正。
// 2021.06.04 Version 1.8  新しいパスワード形式対応。
// 2022.06.06 Version 1.9  固定の形式になってない所からなんとかパスワードを
抽出する対応。
//                         パスワードを範囲選択してから実行してもいいように
する。
//
// by 秀まるお
// hidesoft.8:04704| 暗号化zip自動解凍マクロ
//
//
//説明:
// このマクロはパスワード付きzipの添付ファイルを簡単に解凍する用のマクロです。
// パスワード付きzipの添付ファイル入りメールは、そのメールとは別便でパスワード
// を通知してきます。このマクロはその別便メールの中からパスワードを取り出して、
// 自動で解凍します。
//
// マクロを実行する前に、zip添付ファイル付きのメールとパスワード通知メールの
// 2通を選択して実行する必要があります。

//解凍したファイルは「ドキュメント」フォルダ配下のPasswordZipTempフォルダに
// 作成されます。古いファイルが残ってる場合はマクロ実行のタイミングで削除され
// てから解凍されます。
//
// unzip.exeのダウンロード場所:   http://gnuwin32.sourceforge.net/packages/unzip.htm
// 7-Zipのダウンロード場所:       https://sevenzip.osdn.jp/

    loaddll "tkinfo.dll";

    // 秀丸メールの検索パック復元予約
    #n = dllfunc("AutoRestoreFindPack");

    // 秀丸エディタの検索条件復元予約
    setcompatiblemode 0x00020000;

    #n = dllfunc("SetJapaneseCodePageMode", 1);

    #n = dllfunc("SelectedMailCount");
    if( #n != 2 ) {
        message "このマクロは暗号化zip付きメールと、その解凍用パスワード通知
メールの2通を選択した状態で実行してください。";
        endmacro;
    }

    $selectedtext = "";
    if( selecting ) {
        $selectedtext = gettext( seltopx, seltopy, selendx, selendy, 1 );
    }

    //対象のzipとパスワードを取り出す。
    $zipfile = "";
    $password = "";
    #n = dllfunc("LockSelection");
    while(1) {
        #n = dllfunc("EnumSelection", 1);
        if( #n == 0 ) {
            break;
        }
        #foundzip = 0;
        if( $zipfile == "" ) {
            #count = dllfunc("CountCurrentHeader", "X-Attach");
            if( #count != 0 ) {
                #i = 0;
                while( #i < #count ) {
                    $attach = dllfuncstr("CurrentHeader2", "X-Attach", #i);
                    $ext = dllfuncstr("ToLower", rightstr( $attach, 4 ) );
                    if( $ext == ".zip" ) {
                        $zipfile = dllfuncstr("HomeDir") + dllfuncstr("Curre
ntAccount") + "\\" + $attach;
                        #foundzip = 1;
                        break;
                    }
                    #i = #i + 1;
                }
            }
        }
        if( $password == "" && #foundzip == 0 ) {
            $text = gettext( 0, 0, 999, linecount );        //メール本文全部
            loaddll "HmJre.dll";
            #n = dllfunc("SetUnicodeIndexAutoConvert", 1);      //V1.6 バグ修正
            $text = dllfuncstr("ReplaceRegularNoCaseSense", "[\\r\\n]+", $te
xt, 0, " ", 2);
                        //改行を空白に変換しておく。
            $text = dllfuncstr("ReplaceRegularNoCaseSense", " +", $text, 0,
 " ", 2);
                        //全角空白を半角空白に変換しておく。
            $text = $text + " ";        //末端に空白を付けておく。

            $pattern[0] = " 【パスワード】 *[::]? *([^ \x81\x40-\xFC\xFF]
+?) ";
            $pattern[1] = " 解凍パスワード *[::]? *([^ \x81\x40-\xFC\xFF]
+?) ";
            $pattern[2] = " Password *: *([^ \x81\x40-\xFC\xFF]+?) ";
            $pattern[3] = " \\[パスワード/Password\\] *([^ \x81\x40-\xFC\xF
F]+?) ";
            $pattern[4] = " 【暗号化パスワード\\(password\\)】 *([^ \x81\x40
-\xFC\xFF]+?) ";
            $pattern[5] = " パスワードは「([^ \x81\x40-\xFC\xFF]+?)」";
            $pattern[6] = " 解凍パスワード +([^ \x81\x40-\xFC\xFF]+?) ";
            $pattern[7] = " パスワード *[::] *([^ \x81\x40-\xFC\xFF]+?) ";
            $pattern[8] = " 添付ファイルパスワード *[::]? *([^ \x81\x40-\xF
C\xFF]+?) ";
            $pattern[9] = " \\[(?:パスワード|Password)\\] *([^ \x81\x40-\xFC
\xFF]+?) ";
            $pattern[10] = " パスワード *\\(Password\\) *[::]? *([^ \x81\x4
0-\xFC\xFF]+?) ";
            $pattern[11] = " \\[password information\\] *([^ \x81\x40-\xFC\x
FF]+?) ";
            $pattern[12] = " パスワード[  ]*([0-9]+桁) *[::]? *([^ \x81\
x40-\xFC\xFF]+?) ";
            $pattern[13] = " パスワード[  ]*\\([0-9]+桁\\) *[::]? *([^ \x8
1\x40-\xFC\xFF]+?) ";
            $pattern[14] = " PASSWORD for .{1,255} is below: +([^ \x81\x40-\
xFC\xFF]+?) ";
            $pattern[15] = "^[\x81\x40-\xFC\xFF]+パスワード[\x81\x40-\xFC\xF
F]+\n+([^\x81\x40-\xFC\xFF\n]{5,16})";          //V1.9

            #iPattern = 0;
            #cPassword = 0;
            while(1) {
                $pattern = $pattern[#iPattern];
                if( $pattern == "" ) {
                    break;
                }

                //2021.04.28 新しい方式
                #x = 0;
                while(1) {
                    #x = dllfunc("FindRegularNoCaseSense", $pattern, $text,
#x );
                    if( #x >= 0 ) {
Label_EnterHit: ;
                        $hit = midstr( $text, #x, dllfunc("GetLastMatchLengt
h") );
                        #tag1 = dllfunc("GetLastMatchTagPosition", 1);
                        #tag1len = dllfunc("GetLastMatchTagLength", 1);
                        $pass = midstr( $text, #tag1, #tag1len );
                        //message $hit + "\n" + $pass;
                        if( strlen($pass) >= 4 ) {      //4文字以上でないと
ダメ。
                            //同じパスワードがあれば追加しない。
                            #iFindPass = 0;
                            while( #iFindPass < #cPassword ) {
                                if( $password[#iFindPass+1] == $pass ) {
                                    //スキップ
                                    goto Label_SkipAddPass;
                                }
                                #iFindPass = #iFindPass + 1;
                            }
                            $password[#cPassword+1] = $pass;        //注意:
+1した所にセットする。
                            $whole[#cPassword+1] = $hit + "\t" + $pass;    
    //注意: +1した所にセットする。
                            #cPassword = #cPassword + 1;
Label_SkipAddPass:
                        }
                        #x = #x + 1;
                    } else {
                        break;
                    }
                }
                #iPattern = #iPattern + 1;
            }
            loaddll "tkinfo.dll";       //元に戻す。
        }
    }
    #n = dllfunc("UnlockSelection", 1);
    if( $zipfile == "" ) {
        message "zip形式ファイルが見つかりませんでした。";
        endmacro;
    }
    if( #cPassword == 0 ) {
        //V1.9 別パターン。
        //     日本語で「パスワード」を含む文章があって、その次の行にパス
ワードらしき文字列があったらそれを使う。
        //
        $text = gettext( 0, 0, 999, linecount );        //メール本文全部
        loaddll "HmJre.dll";
        $text = dllfuncstr("ReplaceRegularNoCaseSense", "[\\r\\n]+", $text,
0, "\n", 2);
        $pattern = "\n[\x81\x40-\xFC\xFF]*パスワード[\x81\x40-\xFC\xFF]+\n
([^\x81\x40-\xFC\xFF \n]{5,20})";          //V1.9
        #n = dllfunc("SetUnicodeIndexAutoConvert", 1);      //V1.6 バグ修正
        #x = dllfunc("FindRegularNoCaseSense", $pattern, $text, 0 );
        if( #x >= 0 ) {
            #ConfirmPassword = 1;       //パスワードが合ってるかどうかメッ
セージ表示する。
            goto Label_EnterHit;
        }
        loaddll "tkinfo.dll";       //元に戻す。
        if( $selectedtext != "" ) {
            $password[1] = $selectedtext;
            #cPassword = 1;
            #ConfirmPassword = 1;
        } else {
            message "パスワードが見つかりませんでした。メールを2通選択して、
さらにパスワードの文字列をメール内容枠中で選択してからマクロ実行すれば、その
文字列をパスワードとして解凍します。";
            endmacro;
        }
    }
    if( #cPassword > 1 ) {
        $whole[0] = "パスワードの候補が複数見つかりました。どれを使うか選択
してください。";
        menuarray $whole, #cPassword + 1;
        if( result <= 1 ) {
            message "メールを2通選択して、さらにパスワードの文字列をメール
内容枠中で選択してからマクロ実行すれば、その文字列をパスワードとして解凍しま
す。";
            endmacro;
        }
        $password = $password[result-1];        //result == 1の時に$password
[1]を選択する。
    } else {
        $password = $password[1];
        if( #ConfirmPassword == 1 ) {
            question "パスワードは「" + $password + "」でいいですか?";
            if( result != yes ) {
                message "メールを2通選択して、さらにパスワードの文字列を
メール内容枠中で選択してからマクロ実行すれば、その文字列をパスワードとして解
凍します。";
                endmacro;
            }
        }
    }
Label_PasswordDetermined: ;
    if( strstr( $password, "\"" ) >= 0 ) {
        message "パスワードの中にダブルクォーテーションの文字が含まれてます。
このマクロではダブルクォーテーション入りのパスワードで解凍することは出来ませ
ん。手作業で解凍お願いします。";
        endmacro;
    }

    //2021.04.26 unzip.exeがあればそっちを使う。
    //           http://gnuwin32.sourceforge.net/packages/unzip.htm
    //
    $unzip = "C:\\Program Files\\GnuWin32\\bin\\unzip.exe";
    if( ! existfile( $unzip ) ) {
        $unzip = "C:\\Program Files (x86)\\GnuWin32\\bin\\unzip.exe";
        if( ! existfile( $unzip ) ) {
            $unzip = "";
        }
    }

    if( $unzip == "" ) {
        $7zip = "C:\\Program files\\7-Zip\\7z.exe";
        if( ! existfile( $7zip ) ) {
            $7zip = "C:\\Program files (x86)\\7-Zip\\7z.exe";
            if( ! existfile( $7zip ) ) {
                message "7-Zipのプログラム用ファイルが見つかりません。7-Zip
をインストールしてください。\n\n" +
                        "7-Zipは、C:\\Program files\\7-Zip またはC:\\Program
 files (x86)\\7-Zip にインストールされてる必要があります。";
                endmacro;
            }
        }
    }

    openreg "CURRENTUSER","Software\\Microsoft\\Windows\\CurrentVersion\\Exp
lorer\\Shell Folders";
    $outfolder = getregstr("Personal");
    closereg;
    $outfolder = $outfolder + "\\PasswordZipTemp";

    #fsobj = createobject("Scripting.FileSystemObject");
    #folderobj = callmethod_returnobj(#fsobj, "GetFolder", $outfolder + "\\");
    if( #folderobj != 0 ) {
        #subfolderobj = getpropobj(#folderobj, "SubFolders");
        if( #subfolderobj != 0 ) {
            #onefolder = getcollection(#subfolderobj, 2);
            while(1) {
                #onefolder = getcollection(#subfolderobj);
                if( #onefolder == 0 ) {
                    break;
                }
                $subfolder = member(#onefolder, "Name");
                $path = $outfolder + "\\" + $subfolder;
                //テストmessage $path;
                runsync2 "cmd.exe /c rmdir /s /q \"" + $path + "\"";
            }
        }
    }

    #n = dllfunc("Bypass_CreateDirectory", $outfolder);

    if( existfile( $outfolder + "\\*.*" ) ) {
        runsync2 "cmd.exe /c del /f /s /q \"" + $outfolder + "\\*.*\"";    
  //古いファイルのゴミを削除
    }
    #n = dllfunc("Bypass_CreateDirectory", $outfolder);

    if( $unzip != "" ) {
        $command = "\"" + $unzip + "\"" + " -P\"" + $password + "\"" + " -d\
"" + $outfolder + "\" \"" + $zipfile + "\"";
    } else {
        $command = "\"" + $7zip + "\" x -p\"" + $password + "\"" + " -o\"" +
 $outfolder + "\" \"" + $zipfile + "\"";
    }
    #homehidemaru = hidemaruhandle(0);
    #n = dllfunc("NewMail");
    #n = dllfunc("SwitchHeaderView", 0);        //ヘッダ表示なし
    gofiletop;
    beginsel;
    gofileend;
    insert $command + "\n\n";
    gofileend;
    runex $command
            , 1     //同期
            , 0     //標準入力なし
            , ""
            , 5     //標準出力をカーソル位置へ挿入
            , ""
            , 5     //標準エラー出力もカーソル位置へ挿入
            , ""
            , 0     //作業フォルダ指定なし
            , ""
            , 1     //表示あり
            , 0     //描画あり
            , 0     //ANSIで受け取り
            , 0x0001 //2021.05.18 拡張フラグで「%」をそのまま書けるようにする
            ;
    if( !result ) {
        message "unzip.exeまたは7zipの実行に失敗しました。プログラムからの出
力内容を確認してください。";
        endmacro;
    }
    #exitcode = getresultex(9);
    gofileend;
    clearupdated;
    if( #exitcode == 0 || #exitcode == 1 ) {
        //終了コード 参照:
        // 7zip ...      https://sevenzip.osdn.jp/chm/cmdline/exit_codes.htm
        // unzip.exe ... https://community.progress.com/s/article/What-does-Error-Code-mean-on-a-un-Zip-Advanced-Script-1307565966255
        openbyshell $outfolder;
        quit;
    }
    message "unzip.exeまたは7zipからエラーが返っていると思われます。出力結果
を確認してください。";

[ ]
RE:09754 エディタ側でのマクロについてNo.09758
さかみつ さん 22/06/06 22:48
 
早速の対応ありがとうございます。

やってみました。

先に書いた他に類似のものとして次のもやってみました。

>先程のお送りした添付ファイルのパスワードは以下の通りです。
>
>smasa-12346
>
>弊社内システムにより、メールが前後する場合があります。ご了承下さい。

どっちの場合も、パスワードを選択しない状態でやると、「 "パスワードが見つかり
ませんでした。メールを2通選択して、さらにパスワードの文字列をメール内容枠中
で選択してからマクロ実行すれば、その文字列をパスワードとして解凍します。"」
が表示されました。

しかし、どっちの場合もパスワードを範囲指定してから行うと無事に解凍できました。




> 2種類の対策をしてみました。
> ......
>    message "unzip.exeまたは7zipからエラーが返っていると思われます。出力結
>果を確認してください。";

[ ]
RE:09758 エディタ側でのマクロについてNo.09760
秀まるお2 さん 22/06/07 08:46
 
 先日のパターンも今回のパターンも僕の所ではうまくパスワードを自動で拾ってく
れまして、パスワードを範囲選択してから実行しなくても大丈夫ではありますけども、
ダメな場合もあるということなのか・・・、その辺ちょっと分からずです。

 もっとマクロを見直してみます。

[ ]
RE:09760 エディタ側でのマクロについてNo.09766
さかみつ さん 22/06/07 15:11
 
原因が分りました。

次のようなメールでパスワードを記載したメールの引用で、パスワードを送ります的
な言葉が入っているとだめなようです。
正規表現にて下部側のパスワードという文字を拾っているのでしょうか。

> -----Original Message-----
これ以降を削除すると無事に解凍ができました。


<だめパターン>

> xxxx様
>
> お世話になっております。
>
> 先程のお送りした添付ファイルのパスワードは以下の通りです。
>
> AmaEG-1234
>
> 弊社内システムにより、メールが前後する場合があります。ご了承下さい。
>
> よろしくお願い致します。
>
> -----Original Message-----
> From: xxxx
> Sent: xxx
> To: 'xxxx
> Cc: 'xxx
> Subject: RE: xxx
>
> xxx様
>
> お世話になっております。xxxです。
>
> 本日の資料を送付します。
> xxxxxx
> xxxxxx
> xxxxxx
>
> パスワードは別途送付します。
>
> よろしくお願い致します。
>


[ ]
RE:09766 エディタ側でのマクロについてNo.09767
秀まるお2 さん 22/06/07 15:40
 
 もしかしてメール本文の文面自体に引用記号が付いてるのやら?

 ここの会議室に書き込むのに引用記号を付けただけで、実際のメールは引用記号無
しかと思っていたのですけども。

> 先程のお送りした添付ファイルのパスワードは以下の通りです。
>
> AmaEG-1234

 みたいに本当に引用記号(「> 」)が付いてるのですかね。

 もし可能でしたら画面のハードコピーか、「ファイル・エクスポート」でエクス
ポートしたメールを、一部伏せ字にして"maruo@mitene.or.jp"に送ってほしいです。

 それか、ダミーのメールのサンプルを作ってそれを送ってもらってもいいいです。

 画像アップロードサイトにアップロードしてもらってそれのURLを教えてもらえる
だけでもいいです。(差し支えなければここにURLを書き込んでもらってもいい)

 よろしくお願いします。

[ ]
RE:09767 エディタ側でのマクロについてNo.09768
さかみつ さん 22/06/07 16:18
 
分りにくくてすみません。
引用記号は私がつけました。
画面キャプチャをメールしました。
よろしくお願いします <m(__)m>

> もしかしてメール本文の文面自体に引用記号が付いてるのやら?
> ......
> よろしくお願いします。

[ ]
RE:09768 エディタ側でのマクロについてNo.09769
秀まるお2 さん 22/06/07 16:44
 
 伏せ字にした上で画面ハードコピー送っていただきありがとうございます。見た感
じ、特に僕の想定外のことは無いみたいでした。

 文面的に何もイレギュラーなことは無くて、なぜうまくいかないのかよく分からず
です。とりあえず、もっと寛容性の高い別の仕組みに直してみます。

[ ]
RE:09769 エディタ側でのマクロについてNo.09770
秀まるお2 さん 22/06/07 17:28
 
 もっとシンプルにしてみました。これでどうでしょうか。

----------------------------------------------------------------------------
-----------------
//暗号化Zipの自動解凍 PasswordZipExtract.mac
// 2019.02.12
// 2019.03.07 Version 1.1 パスワードの形式追加。
// 2019.03.12 Version 1.2 パスワードの形式さらに追加。
// 2021.04.26 Version 1.3
//            7-Zipの代わりにunzip.exeでも解凍できるようにした。
//            パスワードの形式にもっといろいろ追加。&、複数候補あった場合は
メニュー表示するようにした。
// 2021.05.10 Version 1.4 さらに形式追加。11〜12
//            unzip.exeまたは7zip.exeの終了コードを見て、成功してる場合は結
果表示しないようにした。
// 2021.05.11 Version 1.5 PasswordZipTempフォルダにサブフォルダのゴミが残る
バグ修正。
// 2021.05.13 Version 1.6 メール本文にユニコード文字(Shift-JIS範囲外の文
字)があるとパスワードがおかしくなるバグ修正。
// 2021.05.18 Version 1.7  パスワードの中に「%」があると失敗するバグ修正。
// 2021.06.04 Version 1.8  新しいパスワード形式対応。
// 2022.06.06 Version 1.9  固定の形式になってない所からなんとかパスワードを
抽出する対応。
//                         パスワードを範囲選択してから実行してもいいように
する。
//
// by 秀まるお
// hidesoft.8:04704| 暗号化zip自動解凍マクロ
//
//
//説明:
// このマクロはパスワード付きzipの添付ファイルを簡単に解凍する用のマクロです。
// パスワード付きzipの添付ファイル入りメールは、そのメールとは別便でパスワード
// を通知してきます。このマクロはその別便メールの中からパスワードを取り出して、
// 自動で解凍します。
//
// マクロを実行する前に、zip添付ファイル付きのメールとパスワード通知メールの
// 2通を選択して実行する必要があります。

//解凍したファイルは「ドキュメント」フォルダ配下のPasswordZipTempフォルダに
// 作成されます。古いファイルが残ってる場合はマクロ実行のタイミングで削除され
// てから解凍されます。
//
// unzip.exeのダウンロード場所:   http://gnuwin32.sourceforge.net/packages/unzip.htm
// 7-Zipのダウンロード場所:       https://sevenzip.osdn.jp/

    loaddll "tkinfo.dll";

    // 秀丸メールの検索パック復元予約
    #n = dllfunc("AutoRestoreFindPack");

    // 秀丸エディタの検索条件復元予約
    setcompatiblemode 0x00020000;

    #n = dllfunc("SetJapaneseCodePageMode", 1);

    #n = dllfunc("SelectedMailCount");
    if( #n != 2 ) {
        message "このマクロは暗号化zip付きメールと、その解凍用パスワード通知
メールの2通を選択した状態で実行してください。";
        endmacro;
    }

    $selectedtext = "";
    if( selecting ) {
        $selectedtext = gettext( seltopx, seltopy, selendx, selendy, 1 );
    }

    //対象のzipとパスワードを取り出す。
    $zipfile = "";
    $password = "";
    #n = dllfunc("LockSelection");
    while(1) {
        #n = dllfunc("EnumSelection", 1);
        if( #n == 0 ) {
            break;
        }
        #foundzip = 0;
        if( $zipfile == "" ) {
            #count = dllfunc("CountCurrentHeader", "X-Attach");
            if( #count != 0 ) {
                #i = 0;
                while( #i < #count ) {
                    $attach = dllfuncstr("CurrentHeader2", "X-Attach", #i);
                    $ext = dllfuncstr("ToLower", rightstr( $attach, 4 ) );
                    if( $ext == ".zip" ) {
                        $zipfile = dllfuncstr("HomeDir") + dllfuncstr("Curre
ntAccount") + "\\" + $attach;
                        #foundzip = 1;
                        break;
                    }
                    #i = #i + 1;
                }
            }
        }
        if( $password == "" && #foundzip == 0 ) {
            $text = gettext( 0, 0, 999, linecount );        //メール本文全部
            loaddll "HmJre.dll";
            #n = dllfunc("SetUnicodeIndexAutoConvert", 1);      //V1.6 バグ修正
            $text = dllfuncstr("ReplaceRegularNoCaseSense", "[\\r\\n]+", $te
xt, 0, " ", 2);
                        //改行を空白に変換しておく。
            $text = dllfuncstr("ReplaceRegularNoCaseSense", " +", $text, 0,
 " ", 2);
                        //全角空白を半角空白に変換しておく。
            $text = $text + " ";        //末端に空白を付けておく。

            $pattern[0] = " 【パスワード】 *[::]? *([^ \x81\x40-\xFC\xFF]
+?) ";
            $pattern[1] = " 解凍パスワード *[::]? *([^ \x81\x40-\xFC\xFF]
+?) ";
            $pattern[2] = " Password *: *([^ \x81\x40-\xFC\xFF]+?) ";
            $pattern[3] = " \\[パスワード/Password\\] *([^ \x81\x40-\xFC\xF
F]+?) ";
            $pattern[4] = " 【暗号化パスワード\\(password\\)】 *([^ \x81\x40
-\xFC\xFF]+?) ";
            $pattern[5] = " パスワードは「([^ \x81\x40-\xFC\xFF]+?)」";
            $pattern[6] = " 解凍パスワード +([^ \x81\x40-\xFC\xFF]+?) ";
            $pattern[7] = " パスワード *[::] *([^ \x81\x40-\xFC\xFF]+?) ";
            $pattern[8] = " 添付ファイルパスワード *[::]? *([^ \x81\x40-\xF
C\xFF]+?) ";
            $pattern[9] = " \\[(?:パスワード|Password)\\] *([^ \x81\x40-\xFC
\xFF]+?) ";
            $pattern[10] = " パスワード *\\(Password\\) *[::]? *([^ \x81\x4
0-\xFC\xFF]+?) ";
            $pattern[11] = " \\[password information\\] *([^ \x81\x40-\xFC\x
FF]+?) ";
            $pattern[12] = " パスワード[  ]*([0-9]+桁) *[::]? *([^ \x81\
x40-\xFC\xFF]+?) ";
            $pattern[13] = " パスワード[  ]*\\([0-9]+桁\\) *[::]? *([^ \x8
1\x40-\xFC\xFF]+?) ";
            $pattern[14] = " PASSWORD for .{1,255} is below: +([^ \x81\x40-\
xFC\xFF]+?) ";

            #NeedConfirmIndex = 15;     //これ以降のパターンについては確認メ
ッセージを出す。
            $pattern[15] = "パスワード[^ ]*? +([!-~]{4,20})( |$)";
                            //V1.9寛容性が一番高い。「パスワード」って文字列
があってその後パスワードが別行になってる。


            #iPattern = 0;
            #cPassword = 0;
            while(1) {
                $pattern = $pattern[#iPattern];
                if( $pattern == "" ) {
                    break;
                }

                //2021.04.28 新しい方式
                #x = 0;
                while(1) {
                    #x = dllfunc("FindRegularNoCaseSense", $pattern, $text,
#x );
                    if( #x >= 0 ) {
Label_EnterHit: ;
                        $hit = midstr( $text, #x, dllfunc("GetLastMatchLengt
h") );
                        #tag1 = dllfunc("GetLastMatchTagPosition", 1);
                        #tag1len = dllfunc("GetLastMatchTagLength", 1);
                        $pass = midstr( $text, #tag1, #tag1len );
                        //message $hit + "\n" + $pass;
                        if( strlen($pass) >= 4 ) {      //4文字以上でないと
ダメ。
                            //同じパスワードがあれば追加しない。
                            #iFindPass = 0;
                            while( #iFindPass < #cPassword ) {
                                if( $password[#iFindPass+1] == $pass ) {
                                    //スキップ
                                    goto Label_SkipAddPass;
                                }
                                #iFindPass = #iFindPass + 1;
                            }
                            $password[#cPassword+1] = $pass;        //注意:
+1した所にセットする。
                            $whole[#cPassword+1] = $hit + "\t" + $pass;    
    //注意: +1した所にセットする。
                            #cPassword = #cPassword + 1;
                            if( #cPassword == 1 && #iPattern >= #NeedConfirm
Index ) {
                                #ConfirmPassword = 1;
                            }
Label_SkipAddPass:
                        }
                        #x = #x + 1;
                    } else {
                        break;
                    }
                }
                #iPattern = #iPattern + 1;
            }
            loaddll "tkinfo.dll";       //元に戻す。
        }
    }
    #n = dllfunc("UnlockSelection", 1);
    if( $zipfile == "" ) {
        message "zip形式ファイルが見つかりませんでした。";
        endmacro;
    }

//V1.9 作ったけど没
//  if( #cPassword == 0 ) {
//      ...中身削除。
//  }
    if( #cPassword > 1 ) {
        $whole[0] = "パスワードの候補が複数見つかりました。どれを使うか選択
してください。";
        menuarray $whole, #cPassword + 1;
        if( result <= 1 ) {
            message "メールを2通選択して、さらにパスワードの文字列をメール
内容枠中で選択してからマクロ実行すれば、その文字列をパスワードとして解凍しま
す。";
            endmacro;
        }
        $password = $password[result-1];        //result == 1の時に$password
[1]を選択する。
    } else {
        $password = $password[1];
        if( #ConfirmPassword == 1 ) {
            question "パスワードは「" + $password + "」でいいですか?";
            if( result != yes ) {
                message "メールを2通選択して、さらにパスワードの文字列を
メール内容枠中で選択してからマクロ実行すれば、その文字列をパスワードとして解
凍します。";
                endmacro;
            }
        }
    }
Label_PasswordDetermined: ;
    if( strstr( $password, "\"" ) >= 0 ) {
        message "パスワードの中にダブルクォーテーションの文字が含まれてます。
このマクロではダブルクォーテーション入りのパスワードで解凍することは出来ませ
ん。手作業で解凍お願いします。";
        endmacro;
    }

    //2021.04.26 unzip.exeがあればそっちを使う。
    //           http://gnuwin32.sourceforge.net/packages/unzip.htm
    //
    $unzip = "C:\\Program Files\\GnuWin32\\bin\\unzip.exe";
    if( ! existfile( $unzip ) ) {
        $unzip = "C:\\Program Files (x86)\\GnuWin32\\bin\\unzip.exe";
        if( ! existfile( $unzip ) ) {
            $unzip = "";
        }
    }

    if( $unzip == "" ) {
        $7zip = "C:\\Program files\\7-Zip\\7z.exe";
        if( ! existfile( $7zip ) ) {
            $7zip = "C:\\Program files (x86)\\7-Zip\\7z.exe";
            if( ! existfile( $7zip ) ) {
                message "7-Zipのプログラム用ファイルが見つかりません。7-Zip
をインストールしてください。\n\n" +
                        "7-Zipは、C:\\Program files\\7-Zip またはC:\\Program
 files (x86)\\7-Zip にインストールされてる必要があります。";
                endmacro;
            }
        }
    }

    openreg "CURRENTUSER","Software\\Microsoft\\Windows\\CurrentVersion\\Exp
lorer\\Shell Folders";
    $outfolder = getregstr("Personal");
    closereg;
    $outfolder = $outfolder + "\\PasswordZipTemp";

    #fsobj = createobject("Scripting.FileSystemObject");
    #folderobj = callmethod_returnobj(#fsobj, "GetFolder", $outfolder + "\\");
    if( #folderobj != 0 ) {
        #subfolderobj = getpropobj(#folderobj, "SubFolders");
        if( #subfolderobj != 0 ) {
            #onefolder = getcollection(#subfolderobj, 2);
            while(1) {
                #onefolder = getcollection(#subfolderobj);
                if( #onefolder == 0 ) {
                    break;
                }
                $subfolder = member(#onefolder, "Name");
                $path = $outfolder + "\\" + $subfolder;
                //テストmessage $path;
                runsync2 "cmd.exe /c rmdir /s /q \"" + $path + "\"";
            }
        }
    }

    #n = dllfunc("Bypass_CreateDirectory", $outfolder);

    if( existfile( $outfolder + "\\*.*" ) ) {
        runsync2 "cmd.exe /c del /f /s /q \"" + $outfolder + "\\*.*\"";    
  //古いファイルのゴミを削除
    }
    #n = dllfunc("Bypass_CreateDirectory", $outfolder);

    if( $unzip != "" ) {
        $command = "\"" + $unzip + "\"" + " -P\"" + $password + "\"" + " -d\
"" + $outfolder + "\" \"" + $zipfile + "\"";
    } else {
        $command = "\"" + $7zip + "\" x -p\"" + $password + "\"" + " -o\"" +
 $outfolder + "\" \"" + $zipfile + "\"";
    }
    #homehidemaru = hidemaruhandle(0);
    #n = dllfunc("NewMail");
    #n = dllfunc("SwitchHeaderView", 0);        //ヘッダ表示なし
    gofiletop;
    beginsel;
    gofileend;
    insert $command + "\n\n";
    gofileend;
    runex $command
            , 1     //同期
            , 0     //標準入力なし
            , ""
            , 5     //標準出力をカーソル位置へ挿入
            , ""
            , 5     //標準エラー出力もカーソル位置へ挿入
            , ""
            , 0     //作業フォルダ指定なし
            , ""
            , 1     //表示あり
            , 0     //描画あり
            , 0     //ANSIで受け取り
            , 0x0001 //2021.05.18 拡張フラグで「%」をそのまま書けるようにする
            ;
    if( !result ) {
        message "unzip.exeまたは7zipの実行に失敗しました。プログラムからの出
力内容を確認してください。";
        endmacro;
    }
    #exitcode = getresultex(9);
    gofileend;
    clearupdated;
    if( #exitcode == 0 || #exitcode == 1 ) {
        //終了コード 参照:
        // 7zip ...      https://sevenzip.osdn.jp/chm/cmdline/exit_codes.htm
        // unzip.exe ... https://community.progress.com/s/article/What-does-Error-Code-mean-on-a-un-Zip-Advanced-Script-1307565966255
        openbyshell $outfolder;
        quit;
    }
    message "unzip.exeまたは7zipからエラーが返っていると思われます。出力結果
を確認してください。";

[ ]
RE:09770 エディタ側でのマクロについてNo.09771
さかみつ さん 22/06/07 18:11
 
ありがとうございます!!

2つの例で試してみました。
ともにバッチリです!


> もっとシンプルにしてみました。これでどうでしょうか。
> ......
>    message "unzip.exeまたは7zipからエラーが返っていると思われます。出力結
>果を確認してください。";

[ ]
RE:09771 エディタ側でのマクロについてNo.09772
秀まるお2 さん 22/06/07 18:31
 
 確認ありがとうございます。

 ・送っていただいた画面ハードコピーのメールは念のため完全削除しました。
 ・ライブラリの方も明日更新します。

[ ]
RE:09772 エディタ側でのマクロについてNo.09783
さかみつ さん 22/06/09 12:40
 
なんどもすみません。

パスワードを選択した状態でマクロ実行するとうまく動かないようです。


"C:\Program Files (x86)\GnuWin32\bin\unzip.exe" -P""  **以下省略**
error:  must give decryption password with -P option

とパスワードが入っていないようです。

ちなみに、先ほど以下のような新しいパターンでパスワードの通知があり、
パスワードという言葉がないので"abc0609"を選択してマクロ実行したところ
うまく動かないことがわかりました。

--
先ほどのファイルには「abc0609」を
ご利用くださいませ。
--

ちなみに、掲示していただいた一つ前のバージョンでは選択しての解答は
うまくいきました。

なんどもすみません。よろしくおねがいいたします。

> 確認ありがとうございます。
>
> ・送っていただいた画面ハードコピーのメールは念のため完全削除しました。
> ・ライブラリの方も明日更新します。

[ ]
RE:09783 エディタ側でのマクロについてNo.09784
さかみつ さん 22/06/09 14:00
 
誤解のないように付け加えます。

さきのようなパスワードの連絡はパスワードという文字が入っていないので
自動でパスワード部分を検出するのは難しいと思っています。

なので、うまく動かないということについては、パスワード部分を選択した
のにunzipにパスワードが引継がれていないという部分になります。

よろしくおねがいいたします。


>なんどもすみません。
> ......
>> ・ライブラリの方も明日更新します。

[ ]
RE:09784 エディタ側でのマクロについてNo.09785
秀まるお2 さん 22/06/09 14:44
 
 範囲選択の処理ですが、すみませんが抜けてしまってました。

 それと、「abc0000」みたいな「」で囲むの書き方についても対応できました。

 あと、ライブラリにアップロードしようと思ってて忘れてました。けがの功名じゃ
ないですが、どっちにしてもまた直すことになったのでアップロード忘れて良かった
気もします。

 マクロは以下のような感じになりました。すみませんがまた動作確認お願いします。
さらにはこれでもまだダメなパターンがあったとしても、とにかくヒットしまくるよ
うな対応をすれば対応できそうな気がするので、また面倒なケースがあったら連絡く
ださい。

----------------------------------------------------------------
//暗号化Zipの自動解凍 PasswordZipExtract.mac
// 2019.02.12
// 2019.03.07 Version 1.1 パスワードの形式追加。
// 2019.03.12 Version 1.2 パスワードの形式さらに追加。
// 2021.04.26 Version 1.3
//            7-Zipの代わりにunzip.exeでも解凍できるようにした。
//            パスワードの形式にもっといろいろ追加。&、複数候補あった場合は
メニュー表示するようにした。
// 2021.05.10 Version 1.4 さらに形式追加。11〜12
//            unzip.exeまたは7zip.exeの終了コードを見て、成功してる場合は結
果表示しないようにした。
// 2021.05.11 Version 1.5 PasswordZipTempフォルダにサブフォルダのゴミが残る
バグ修正。
// 2021.05.13 Version 1.6 メール本文にユニコード文字(Shift-JIS範囲外の文
字)があるとパスワードがおかしくなるバグ修正。
// 2021.05.18 Version 1.7  パスワードの中に「%」があると失敗するバグ修正。
// 2021.06.04 Version 1.8  新しいパスワード形式対応。
// 2022.06.06 Version 1.9  固定の形式になってない所からなんとかパスワードを
抽出する対応。
//                         パスワードを範囲選択してから実行してもいいように
する。
//
// by 秀まるお
// hidesoft.8:04704| 暗号化zip自動解凍マクロ
//
//
//説明:
// このマクロはパスワード付きzipの添付ファイルを簡単に解凍する用のマクロです。
// パスワード付きzipの添付ファイル入りメールは、そのメールとは別便でパスワード
// を通知してきます。このマクロはその別便メールの中からパスワードを取り出して、
// 自動で解凍します。
//
// マクロを実行する前に、zip添付ファイル付きのメールとパスワード通知メールの
// 2通を選択して実行する必要があります。

//解凍したファイルは「ドキュメント」フォルダ配下のPasswordZipTempフォルダに
// 作成されます。古いファイルが残ってる場合はマクロ実行のタイミングで削除され
// てから解凍されます。
//
// unzip.exeのダウンロード場所:   http://gnuwin32.sourceforge.net/packages/unzip.htm
// 7-Zipのダウンロード場所:       https://sevenzip.osdn.jp/

    loaddll "tkinfo.dll";

    // 秀丸メールの検索パック復元予約
    #n = dllfunc("AutoRestoreFindPack");

    // 秀丸エディタの検索条件復元予約
    setcompatiblemode 0x00020000;

    #n = dllfunc("SetJapaneseCodePageMode", 1);

    #n = dllfunc("SelectedMailCount");
    if( #n != 2 ) {
        message "このマクロは暗号化zip付きメールと、その解凍用パスワード通知
メールの2通を選択した状態で実行してください。";
        endmacro;
    }

    $selectedtext = "";
    if( selecting ) {
        $selectedtext = gettext( seltopx, seltopy, selendx, selendy, 1 );
    }

    //対象のzipとパスワードを取り出す。
    $zipfile = "";
    $password = "";
    #n = dllfunc("LockSelection");
    while(1) {
        #n = dllfunc("EnumSelection", 1);
        if( #n == 0 ) {
            break;
        }
        #foundzip = 0;
        if( $zipfile == "" ) {
            #count = dllfunc("CountCurrentHeader", "X-Attach");
            if( #count != 0 ) {
                #i = 0;
                while( #i < #count ) {
                    $attach = dllfuncstr("CurrentHeader2", "X-Attach", #i);
                    $ext = dllfuncstr("ToLower", rightstr( $attach, 4 ) );
                    if( $ext == ".zip" ) {
                        $zipfile = dllfuncstr("HomeDir") + dllfuncstr("Curre
ntAccount") + "\\" + $attach;
                        #foundzip = 1;
                        break;
                    }
                    #i = #i + 1;
                }
            }
        }
        if( $password == "" && #foundzip == 0 ) {
            $text = gettext( 0, 0, 999, linecount );        //メール本文全部
            loaddll "HmJre.dll";
            #n = dllfunc("SetUnicodeIndexAutoConvert", 1);      //V1.6 バグ修正
            $text = dllfuncstr("ReplaceRegularNoCaseSense", "[\\r\\n]+", $te
xt, 0, " ", 2);
                        //改行を空白に変換しておく。
            $text = dllfuncstr("ReplaceRegularNoCaseSense", " +", $text, 0,
 " ", 2);
                        //全角空白を半角空白に変換しておく。
            $text = $text + " ";        //末端に空白を付けておく。

            $pattern[0] = " 【パスワード】 *[::]? *([^ \x81\x40-\xFC\xFF]
+?) ";
            $pattern[1] = " 解凍パスワード *[::]? *([^ \x81\x40-\xFC\xFF]
+?) ";
            $pattern[2] = " Password *: *([^ \x81\x40-\xFC\xFF]+?) ";
            $pattern[3] = " \\[パスワード/Password\\] *([^ \x81\x40-\xFC\xF
F]+?) ";
            $pattern[4] = " 【暗号化パスワード\\(password\\)】 *([^ \x81\x40
-\xFC\xFF]+?) ";
            $pattern[5] = " パスワードは「([^ \x81\x40-\xFC\xFF]+?)」";
            $pattern[6] = " 解凍パスワード +([^ \x81\x40-\xFC\xFF]+?) ";
            $pattern[7] = " パスワード *[::] *([^ \x81\x40-\xFC\xFF]+?) ";
            $pattern[8] = " 添付ファイルパスワード *[::]? *([^ \x81\x40-\xF
C\xFF]+?) ";
            $pattern[9] = " \\[(?:パスワード|Password)\\] *([^ \x81\x40-\xFC
\xFF]+?) ";
            $pattern[10] = " パスワード *\\(Password\\) *[::]? *([^ \x81\x4
0-\xFC\xFF]+?) ";
            $pattern[11] = " \\[password information\\] *([^ \x81\x40-\xFC\x
FF]+?) ";
            $pattern[12] = " パスワード[  ]*([0-9]+桁) *[::]? *([^ \x81\
x40-\xFC\xFF]+?) ";
            $pattern[13] = " パスワード[  ]*\\([0-9]+桁\\) *[::]? *([^ \x8
1\x40-\xFC\xFF]+?) ";
            $pattern[14] = " PASSWORD for .{1,255} is below: +([^ \x81\x40-\
xFC\xFF]+?) ";

            #NeedConfirmIndex = 15;     //これ以降のパターンについては確認メ
ッセージを出す。
            $pattern[15] = "パスワード[^ ]*? +([!-~]{4,20}) ";
                            //V1.9寛容性が一番高い。「パスワード」って文字列
があってその後パスワードが別行になってる。
            $pattern[16] = "「+([!-~]{4,20})」";
                            //V1.9「」で囲んだ中にパスワードらしき文字列があ
る場合対応。


            #iPattern = 0;
            #cPassword = 0;
            while(1) {
                $pattern = $pattern[#iPattern];
                if( $pattern == "" ) {
                    break;
                }

                //2021.04.28 新しい方式
                #x = 0;
                while(1) {
                    #x = dllfunc("FindRegularNoCaseSense", $pattern, $text,
#x );
                    if( #x >= 0 ) {
Label_EnterHit: ;
                        $hit = midstr( $text, #x, dllfunc("GetLastMatchLengt
h") );
                        #tag1 = dllfunc("GetLastMatchTagPosition", 1);
                        #tag1len = dllfunc("GetLastMatchTagLength", 1);
                        $pass = midstr( $text, #tag1, #tag1len );
                        //message $hit + "\n" + $pass;
                        if( strlen($pass) >= 4 ) {      //4文字以上でないと
ダメ。
                            //同じパスワードがあれば追加しない。
                            #iFindPass = 0;
                            while( #iFindPass < #cPassword ) {
                                if( $password[#iFindPass+1] == $pass ) {
                                    //スキップ
                                    goto Label_SkipAddPass;
                                }
                                #iFindPass = #iFindPass + 1;
                            }
                            $password[#cPassword+1] = $pass;        //注意:
+1した所にセットする。
                            $whole[#cPassword+1] = $hit + "\t" + $pass;    
    //注意: +1した所にセットする。
                            #cPassword = #cPassword + 1;
                            if( #cPassword == 1 && #iPattern >= #NeedConfirm
Index ) {
                                #ConfirmPassword = 1;
                            }
Label_SkipAddPass:
                        }
                        #x = #x + 1;
                    } else {
                        break;
                    }
                }
                #iPattern = #iPattern + 1;
            }
            loaddll "tkinfo.dll";       //元に戻す。
        }
    }
    #n = dllfunc("UnlockSelection", 1);
    if( $zipfile == "" ) {
        message "zip形式ファイルが見つかりませんでした。";
        endmacro;
    }

//V1.9 作ったけど没
//  if( #cPassword == 0 ) {
//      ...中身削除。
//  }

    if( $selectedtext != "" ) {
        $password[#cPassword+1] = $selectedtext;        //注意: +1した所にセ
ットする。
        $whole[#cPassword+1] = "(範囲選択した文字列)" + "\t" + $selectedtex
t;         //注意: +1した所にセットする。
        #cPassword = #cPassword + 1;
        #ConfirmPassword = 1;
    }
    if( #cPassword > 1 ) {
        $whole[0] = "パスワードの候補が複数見つかりました。どれを使うか選択
してください。";
        menuarray $whole, #cPassword + 1;
        if( result <= 1 ) {
            message "メールを2通選択して、さらにパスワードの文字列をメール
内容枠中で選択してからマクロ実行すれば、その文字列をパスワードとして解凍しま
す。";
            endmacro;
        }
        $password = $password[result-1];        //result == 1の時に$password
[1]を選択する。
    } else {
        $password = $password[1];
        if( #ConfirmPassword == 1 ) {
            question "パスワードは「" + $password + "」でいいですか?";
            if( result != yes ) {
                message "メールを2通選択して、さらにパスワードの文字列を
メール内容枠中で選択してからマクロ実行すれば、その文字列をパスワードとして解
凍します。";
                endmacro;
            }
        }
    }
Label_PasswordDetermined: ;
    if( strstr( $password, "\"" ) >= 0 ) {
        message "パスワードの中にダブルクォーテーションの文字が含まれてます。
このマクロではダブルクォーテーション入りのパスワードで解凍することは出来ませ
ん。手作業で解凍お願いします。";
        endmacro;
    }

    //2021.04.26 unzip.exeがあればそっちを使う。
    //           http://gnuwin32.sourceforge.net/packages/unzip.htm
    //
    $unzip = "C:\\Program Files\\GnuWin32\\bin\\unzip.exe";
    if( ! existfile( $unzip ) ) {
        $unzip = "C:\\Program Files (x86)\\GnuWin32\\bin\\unzip.exe";
        if( ! existfile( $unzip ) ) {
            $unzip = "";
        }
    }

    if( $unzip == "" ) {
        $7zip = "C:\\Program files\\7-Zip\\7z.exe";
        if( ! existfile( $7zip ) ) {
            $7zip = "C:\\Program files (x86)\\7-Zip\\7z.exe";
            if( ! existfile( $7zip ) ) {
                message "7-Zipのプログラム用ファイルが見つかりません。7-Zip
をインストールしてください。\n\n" +
                        "7-Zipは、C:\\Program files\\7-Zip またはC:\\Program
 files (x86)\\7-Zip にインストールされてる必要があります。";
                endmacro;
            }
        }
    }

    openreg "CURRENTUSER","Software\\Microsoft\\Windows\\CurrentVersion\\Exp
lorer\\Shell Folders";
    $outfolder = getregstr("Personal");
    closereg;
    $outfolder = $outfolder + "\\PasswordZipTemp";

    #fsobj = createobject("Scripting.FileSystemObject");
    #folderobj = callmethod_returnobj(#fsobj, "GetFolder", $outfolder + "\\");
    if( #folderobj != 0 ) {
        #subfolderobj = getpropobj(#folderobj, "SubFolders");
        if( #subfolderobj != 0 ) {
            #onefolder = getcollection(#subfolderobj, 2);
            while(1) {
                #onefolder = getcollection(#subfolderobj);
                if( #onefolder == 0 ) {
                    break;
                }
                $subfolder = member(#onefolder, "Name");
                $path = $outfolder + "\\" + $subfolder;
                //テストmessage $path;
                runsync2 "cmd.exe /c rmdir /s /q \"" + $path + "\"";
            }
        }
    }

    #n = dllfunc("Bypass_CreateDirectory", $outfolder);

    if( existfile( $outfolder + "\\*.*" ) ) {
        runsync2 "cmd.exe /c del /f /s /q \"" + $outfolder + "\\*.*\"";    
  //古いファイルのゴミを削除
    }
    #n = dllfunc("Bypass_CreateDirectory", $outfolder);

    if( $unzip != "" ) {
        $command = "\"" + $unzip + "\"" + " -P\"" + $password + "\"" + " -d\
"" + $outfolder + "\" \"" + $zipfile + "\"";
    } else {
        $command = "\"" + $7zip + "\" x -p\"" + $password + "\"" + " -o\"" +
 $outfolder + "\" \"" + $zipfile + "\"";
    }
    #homehidemaru = hidemaruhandle(0);
    #n = dllfunc("NewMail");
    #n = dllfunc("SwitchHeaderView", 0);        //ヘッダ表示なし
    gofiletop;
    beginsel;
    gofileend;
    insert $command + "\n\n";
    gofileend;
    runex $command
            , 1     //同期
            , 0     //標準入力なし
            , ""
            , 5     //標準出力をカーソル位置へ挿入
            , ""
            , 5     //標準エラー出力もカーソル位置へ挿入
            , ""
            , 0     //作業フォルダ指定なし
            , ""
            , 1     //表示あり
            , 0     //描画あり
            , 0     //ANSIで受け取り
            , 0x0001 //2021.05.18 拡張フラグで「%」をそのまま書けるようにする
            ;
    if( !result ) {
        message "unzip.exeまたは7zipの実行に失敗しました。プログラムからの出
力内容を確認してください。";
        endmacro;
    }
    #exitcode = getresultex(9);
    gofileend;
    clearupdated;
    if( #exitcode == 0 || #exitcode == 1 ) {
        //終了コード 参照:
        // 7zip ...      https://sevenzip.osdn.jp/chm/cmdline/exit_codes.htm
        // unzip.exe ... https://community.progress.com/s/article/What-does-Error-Code-mean-on-a-un-Zip-Advanced-Script-1307565966255
        openbyshell $outfolder;
        quit;
    }
    message "unzip.exeまたは7zipからエラーが返っていると思われます。出力結果
を確認してください。";

[ ]
RE:09785 エディタ側でのマクロについてNo.09786
秀まるお2 さん 22/06/09 14:50
 
 すみません。パスワードが見つからない時にエラーメッセージ表示する処理も抜け
てました。こっちでお願いします。

--------------------------------------------------------------
//暗号化Zipの自動解凍 PasswordZipExtract.mac
// 2019.02.12
// 2019.03.07 Version 1.1 パスワードの形式追加。
// 2019.03.12 Version 1.2 パスワードの形式さらに追加。
// 2021.04.26 Version 1.3
//            7-Zipの代わりにunzip.exeでも解凍できるようにした。
//            パスワードの形式にもっといろいろ追加。&、複数候補あった場合は
メニュー表示するようにした。
// 2021.05.10 Version 1.4 さらに形式追加。11〜12
//            unzip.exeまたは7zip.exeの終了コードを見て、成功してる場合は結
果表示しないようにした。
// 2021.05.11 Version 1.5 PasswordZipTempフォルダにサブフォルダのゴミが残る
バグ修正。
// 2021.05.13 Version 1.6 メール本文にユニコード文字(Shift-JIS範囲外の文
字)があるとパスワードがおかしくなるバグ修正。
// 2021.05.18 Version 1.7  パスワードの中に「%」があると失敗するバグ修正。
// 2021.06.04 Version 1.8  新しいパスワード形式対応。
// 2022.06.06 Version 1.9  固定の形式になってない所からなんとかパスワードを
抽出する対応。
//                         パスワードを範囲選択してから実行してもいいように
する。
//
// by 秀まるお
// hidesoft.8:04704| 暗号化zip自動解凍マクロ
//
//
//説明:
// このマクロはパスワード付きzipの添付ファイルを簡単に解凍する用のマクロです。
// パスワード付きzipの添付ファイル入りメールは、そのメールとは別便でパスワード
// を通知してきます。このマクロはその別便メールの中からパスワードを取り出して、
// 自動で解凍します。
//
// マクロを実行する前に、zip添付ファイル付きのメールとパスワード通知メールの
// 2通を選択して実行する必要があります。

//解凍したファイルは「ドキュメント」フォルダ配下のPasswordZipTempフォルダに
// 作成されます。古いファイルが残ってる場合はマクロ実行のタイミングで削除され
// てから解凍されます。
//
// unzip.exeのダウンロード場所:   http://gnuwin32.sourceforge.net/packages/unzip.htm
// 7-Zipのダウンロード場所:       https://sevenzip.osdn.jp/

    loaddll "tkinfo.dll";

    // 秀丸メールの検索パック復元予約
    #n = dllfunc("AutoRestoreFindPack");

    // 秀丸エディタの検索条件復元予約
    setcompatiblemode 0x00020000;

    #n = dllfunc("SetJapaneseCodePageMode", 1);

    #n = dllfunc("SelectedMailCount");
    if( #n != 2 ) {
        message "このマクロは暗号化zip付きメールと、その解凍用パスワード通知
メールの2通を選択した状態で実行してください。";
        endmacro;
    }

    $selectedtext = "";
    if( selecting ) {
        $selectedtext = gettext( seltopx, seltopy, selendx, selendy, 1 );
    }

    //対象のzipとパスワードを取り出す。
    $zipfile = "";
    $password = "";
    #n = dllfunc("LockSelection");
    while(1) {
        #n = dllfunc("EnumSelection", 1);
        if( #n == 0 ) {
            break;
        }
        #foundzip = 0;
        if( $zipfile == "" ) {
            #count = dllfunc("CountCurrentHeader", "X-Attach");
            if( #count != 0 ) {
                #i = 0;
                while( #i < #count ) {
                    $attach = dllfuncstr("CurrentHeader2", "X-Attach", #i);
                    $ext = dllfuncstr("ToLower", rightstr( $attach, 4 ) );
                    if( $ext == ".zip" ) {
                        $zipfile = dllfuncstr("HomeDir") + dllfuncstr("Curre
ntAccount") + "\\" + $attach;
                        #foundzip = 1;
                        break;
                    }
                    #i = #i + 1;
                }
            }
        }
        if( $password == "" && #foundzip == 0 ) {
            $text = gettext( 0, 0, 999, linecount );        //メール本文全部
            loaddll "HmJre.dll";
            #n = dllfunc("SetUnicodeIndexAutoConvert", 1);      //V1.6 バグ修正
            $text = dllfuncstr("ReplaceRegularNoCaseSense", "[\\r\\n]+", $te
xt, 0, " ", 2);
                        //改行を空白に変換しておく。
            $text = dllfuncstr("ReplaceRegularNoCaseSense", " +", $text, 0,
 " ", 2);
                        //全角空白を半角空白に変換しておく。
            $text = $text + " ";        //末端に空白を付けておく。

            $pattern[0] = " 【パスワード】 *[::]? *([^ \x81\x40-\xFC\xFF]
+?) ";
            $pattern[1] = " 解凍パスワード *[::]? *([^ \x81\x40-\xFC\xFF]
+?) ";
            $pattern[2] = " Password *: *([^ \x81\x40-\xFC\xFF]+?) ";
            $pattern[3] = " \\[パスワード/Password\\] *([^ \x81\x40-\xFC\xF
F]+?) ";
            $pattern[4] = " 【暗号化パスワード\\(password\\)】 *([^ \x81\x40
-\xFC\xFF]+?) ";
            $pattern[5] = " パスワードは「([^ \x81\x40-\xFC\xFF]+?)」";
            $pattern[6] = " 解凍パスワード +([^ \x81\x40-\xFC\xFF]+?) ";
            $pattern[7] = " パスワード *[::] *([^ \x81\x40-\xFC\xFF]+?) ";
            $pattern[8] = " 添付ファイルパスワード *[::]? *([^ \x81\x40-\xF
C\xFF]+?) ";
            $pattern[9] = " \\[(?:パスワード|Password)\\] *([^ \x81\x40-\xFC
\xFF]+?) ";
            $pattern[10] = " パスワード *\\(Password\\) *[::]? *([^ \x81\x4
0-\xFC\xFF]+?) ";
            $pattern[11] = " \\[password information\\] *([^ \x81\x40-\xFC\x
FF]+?) ";
            $pattern[12] = " パスワード[  ]*([0-9]+桁) *[::]? *([^ \x81\
x40-\xFC\xFF]+?) ";
            $pattern[13] = " パスワード[  ]*\\([0-9]+桁\\) *[::]? *([^ \x8
1\x40-\xFC\xFF]+?) ";
            $pattern[14] = " PASSWORD for .{1,255} is below: +([^ \x81\x40-\
xFC\xFF]+?) ";

            #NeedConfirmIndex = 15;     //これ以降のパターンについては確認メ
ッセージを出す。
            $pattern[15] = "パスワード[^ ]*? +([!-~]{4,20}) ";
                            //V1.9寛容性が一番高い。「パスワード」って文字列
があってその後パスワードが別行になってる。
            $pattern[16] = "「+([!-~]{4,20})」";
                            //V1.9「」で囲んだ中にパスワードらしき文字列があ
る場合対応。


            #iPattern = 0;
            #cPassword = 0;
            while(1) {
                $pattern = $pattern[#iPattern];
                if( $pattern == "" ) {
                    break;
                }

                //2021.04.28 新しい方式
                #x = 0;
                while(1) {
                    #x = dllfunc("FindRegularNoCaseSense", $pattern, $text,
#x );
                    if( #x >= 0 ) {
Label_EnterHit: ;
                        $hit = midstr( $text, #x, dllfunc("GetLastMatchLengt
h") );
                        #tag1 = dllfunc("GetLastMatchTagPosition", 1);
                        #tag1len = dllfunc("GetLastMatchTagLength", 1);
                        $pass = midstr( $text, #tag1, #tag1len );
                        //message $hit + "\n" + $pass;
                        if( strlen($pass) >= 4 ) {      //4文字以上でないと
ダメ。
                            //同じパスワードがあれば追加しない。
                            #iFindPass = 0;
                            while( #iFindPass < #cPassword ) {
                                if( $password[#iFindPass+1] == $pass ) {
                                    //スキップ
                                    goto Label_SkipAddPass;
                                }
                                #iFindPass = #iFindPass + 1;
                            }
                            $password[#cPassword+1] = $pass;        //注意:
+1した所にセットする。
                            $whole[#cPassword+1] = $hit + "\t" + $pass;    
    //注意: +1した所にセットする。
                            #cPassword = #cPassword + 1;
                            if( #cPassword == 1 && #iPattern >= #NeedConfirm
Index ) {
                                #ConfirmPassword = 1;
                            }
Label_SkipAddPass:
                        }
                        #x = #x + 1;
                    } else {
                        break;
                    }
                }
                #iPattern = #iPattern + 1;
            }
            loaddll "tkinfo.dll";       //元に戻す。
        }
    }
    #n = dllfunc("UnlockSelection", 1);
    if( $zipfile == "" ) {
        message "zip形式ファイルが見つかりませんでした。";
        endmacro;
    }

//V1.9 作ったけど没
//  if( #cPassword == 0 ) {
//      ...中身削除。
//  }

    if( $selectedtext != "" ) {
        $password[#cPassword+1] = $selectedtext;        //注意: +1した所にセ
ットする。
        $whole[#cPassword+1] = "(範囲選択した文字列)" + "\t" + $selectedtex
t;         //注意: +1した所にセットする。
        #cPassword = #cPassword + 1;
        #ConfirmPassword = 1;
    }
    if( #cPassword == 0 ) {
        message "パスワードが不明です。\n\nメールを2通選択して、さらにパス
ワードの文字列をメール内容枠中で選択してからマクロ実行すれば、その文字列をパ
スワードとして解凍します。";
        endmacro;
    }
    if( #cPassword > 1 ) {
        $whole[0] = "パスワードの候補が複数見つかりました。どれを使うか選択
してください。";
        menuarray $whole, #cPassword + 1;
        if( result <= 1 ) {
            message "メールを2通選択して、さらにパスワードの文字列をメール
内容枠中で選択してからマクロ実行すれば、その文字列をパスワードとして解凍しま
す。";
            endmacro;
        }
        $password = $password[result-1];        //result == 1の時に$password
[1]を選択する。
    } else {
        $password = $password[1];
        if( #ConfirmPassword == 1 ) {
            question "パスワードは「" + $password + "」でいいですか?";
            if( result != yes ) {
                message "メールを2通選択して、さらにパスワードの文字列を
メール内容枠中で選択してからマクロ実行すれば、その文字列をパスワードとして解
凍します。";
                endmacro;
            }
        }
    }
Label_PasswordDetermined: ;
    if( strstr( $password, "\"" ) >= 0 ) {
        message "パスワードの中にダブルクォーテーションの文字が含まれてます。
このマクロではダブルクォーテーション入りのパスワードで解凍することは出来ませ
ん。手作業で解凍お願いします。";
        endmacro;
    }

    //2021.04.26 unzip.exeがあればそっちを使う。
    //           http://gnuwin32.sourceforge.net/packages/unzip.htm
    //
    $unzip = "C:\\Program Files\\GnuWin32\\bin\\unzip.exe";
    if( ! existfile( $unzip ) ) {
        $unzip = "C:\\Program Files (x86)\\GnuWin32\\bin\\unzip.exe";
        if( ! existfile( $unzip ) ) {
            $unzip = "";
        }
    }

    if( $unzip == "" ) {
        $7zip = "C:\\Program files\\7-Zip\\7z.exe";
        if( ! existfile( $7zip ) ) {
            $7zip = "C:\\Program files (x86)\\7-Zip\\7z.exe";
            if( ! existfile( $7zip ) ) {
                message "7-Zipのプログラム用ファイルが見つかりません。7-Zip
をインストールしてください。\n\n" +
                        "7-Zipは、C:\\Program files\\7-Zip またはC:\\Program
 files (x86)\\7-Zip にインストールされてる必要があります。";
                endmacro;
            }
        }
    }

    openreg "CURRENTUSER","Software\\Microsoft\\Windows\\CurrentVersion\\Exp
lorer\\Shell Folders";
    $outfolder = getregstr("Personal");
    closereg;
    $outfolder = $outfolder + "\\PasswordZipTemp";

    #fsobj = createobject("Scripting.FileSystemObject");
    #folderobj = callmethod_returnobj(#fsobj, "GetFolder", $outfolder + "\\");
    if( #folderobj != 0 ) {
        #subfolderobj = getpropobj(#folderobj, "SubFolders");
        if( #subfolderobj != 0 ) {
            #onefolder = getcollection(#subfolderobj, 2);
            while(1) {
                #onefolder = getcollection(#subfolderobj);
                if( #onefolder == 0 ) {
                    break;
                }
                $subfolder = member(#onefolder, "Name");
                $path = $outfolder + "\\" + $subfolder;
                //テストmessage $path;
                runsync2 "cmd.exe /c rmdir /s /q \"" + $path + "\"";
            }
        }
    }

    #n = dllfunc("Bypass_CreateDirectory", $outfolder);

    if( existfile( $outfolder + "\\*.*" ) ) {
        runsync2 "cmd.exe /c del /f /s /q \"" + $outfolder + "\\*.*\"";    
  //古いファイルのゴミを削除
    }
    #n = dllfunc("Bypass_CreateDirectory", $outfolder);

    if( $unzip != "" ) {
        $command = "\"" + $unzip + "\"" + " -P\"" + $password + "\"" + " -d\
"" + $outfolder + "\" \"" + $zipfile + "\"";
    } else {
        $command = "\"" + $7zip + "\" x -p\"" + $password + "\"" + " -o\"" +
 $outfolder + "\" \"" + $zipfile + "\"";
    }
    #homehidemaru = hidemaruhandle(0);
    #n = dllfunc("NewMail");
    #n = dllfunc("SwitchHeaderView", 0);        //ヘッダ表示なし
    gofiletop;
    beginsel;
    gofileend;
    insert $command + "\n\n";
    gofileend;
    runex $command
            , 1     //同期
            , 0     //標準入力なし
            , ""
            , 5     //標準出力をカーソル位置へ挿入
            , ""
            , 5     //標準エラー出力もカーソル位置へ挿入
            , ""
            , 0     //作業フォルダ指定なし
            , ""
            , 1     //表示あり
            , 0     //描画あり
            , 0     //ANSIで受け取り
            , 0x0001 //2021.05.18 拡張フラグで「%」をそのまま書けるようにする
            ;
    if( !result ) {
        message "unzip.exeまたは7zipの実行に失敗しました。プログラムからの出
力内容を確認してください。";
        endmacro;
    }
    #exitcode = getresultex(9);
    gofileend;
    clearupdated;
    if( #exitcode == 0 || #exitcode == 1 ) {
        //終了コード 参照:
        // 7zip ...      https://sevenzip.osdn.jp/chm/cmdline/exit_codes.htm
        // unzip.exe ... https://community.progress.com/s/article/What-does-Error-Code-mean-on-a-un-Zip-Advanced-Script-1307565966255
        openbyshell $outfolder;
        quit;
    }
    message "unzip.exeまたは7zipからエラーが返っていると思われます。出力結果
を確認してください。";

[ ]
RE:09786 エディタ側でのマクロについてNo.09791
さかみつ さん 22/06/09 15:12
 
何度もありがとうございます。

試してみました。
一応動くのですがパタン2はちょっと違うかなという感じです。

<パタン1>

 以下や過去のパスワード記載メールをメール2通選択してマクロ実行すると
 無事回答できました。
--
先ほどのファイルには「abc0609」を
ご利用くださいませ。
--

<パタン2>
パタン1での解答が可能な状態で、パスワード部分を選択してマクロ実行すると
「パスワードの候補が複数見つかりました」で自動的に解析されたパスワードと
意図的に選択したパスワードの両者がでてしまいました。
意図的に選択した場合にも複数発見時の処理がかぶっているようです。
 


> すみません。パスワードが見つからない時にエラーメッセージ表示する処理も抜
>けてました。こっちでお願いします。
> ......
>    message "unzip.exeまたは7zipからエラーが返っていると思われます。出力結
>果を確認してください。";

[ ]
RE:09791 エディタ側でのマクロについてNo.09792
秀まるお2 さん 22/06/09 15:32
 
 まいどどうもです。

 範囲選択して実行した場合の重複チェックは、分かってはいましたが手抜きしまし
た。そもそも重複チェックも面倒なことしてたので、もっと簡単なのに直しました。

 これでお願いします。

----------------------------------------------------------------------------
--------------------------
//暗号化Zipの自動解凍 PasswordZipExtract.mac
// 2019.02.12
// 2019.03.07 Version 1.1 パスワードの形式追加。
// 2019.03.12 Version 1.2 パスワードの形式さらに追加。
// 2021.04.26 Version 1.3
//            7-Zipの代わりにunzip.exeでも解凍できるようにした。
//            パスワードの形式にもっといろいろ追加。&、複数候補あった場合は
メニュー表示するようにした。
// 2021.05.10 Version 1.4 さらに形式追加。11〜12
//            unzip.exeまたは7zip.exeの終了コードを見て、成功してる場合は結
果表示しないようにした。
// 2021.05.11 Version 1.5 PasswordZipTempフォルダにサブフォルダのゴミが残る
バグ修正。
// 2021.05.13 Version 1.6 メール本文にユニコード文字(Shift-JIS範囲外の文
字)があるとパスワードがおかしくなるバグ修正。
// 2021.05.18 Version 1.7  パスワードの中に「%」があると失敗するバグ修正。
// 2021.06.04 Version 1.8  新しいパスワード形式対応。
// 2022.06.06 Version 1.9  固定の形式になってない所からなんとかパスワードを
抽出する対応。
//                         パスワードを範囲選択してから実行してもいいように
する。
//
// by 秀まるお
// hidesoft.8:04704| 暗号化zip自動解凍マクロ
//
//
//説明:
// このマクロはパスワード付きzipの添付ファイルを簡単に解凍する用のマクロです。
// パスワード付きzipの添付ファイル入りメールは、そのメールとは別便でパスワード
// を通知してきます。このマクロはその別便メールの中からパスワードを取り出して、
// 自動で解凍します。
//
// マクロを実行する前に、zip添付ファイル付きのメールとパスワード通知メールの
// 2通を選択して実行する必要があります。

//解凍したファイルは「ドキュメント」フォルダ配下のPasswordZipTempフォルダに
// 作成されます。古いファイルが残ってる場合はマクロ実行のタイミングで削除され
// てから解凍されます。
//
// unzip.exeのダウンロード場所:   http://gnuwin32.sourceforge.net/packages/unzip.htm
// 7-Zipのダウンロード場所:       https://sevenzip.osdn.jp/

    loaddll "tkinfo.dll";

    // 秀丸メールの検索パック復元予約
    #n = dllfunc("AutoRestoreFindPack");

    // 秀丸エディタの検索条件復元予約
    setcompatiblemode 0x00020000;

    #n = dllfunc("SetJapaneseCodePageMode", 1);

    #n = dllfunc("SelectedMailCount");
    if( #n != 2 ) {
        message "このマクロは暗号化zip付きメールと、その解凍用パスワード通知
メールの2通を選択した状態で実行してください。";
        endmacro;
    }

    $selectedtext = "";
    if( selecting ) {
        $selectedtext = gettext( seltopx, seltopy, selendx, selendy, 1 );
    }

    //対象のzipとパスワードを取り出す。
    $zipfile = "";
    $password = "";
    #n = dllfunc("LockSelection");
    while(1) {
        #n = dllfunc("EnumSelection", 1);
        if( #n == 0 ) {
            break;
        }
        #foundzip = 0;
        if( $zipfile == "" ) {
            #count = dllfunc("CountCurrentHeader", "X-Attach");
            if( #count != 0 ) {
                #i = 0;
                while( #i < #count ) {
                    $attach = dllfuncstr("CurrentHeader2", "X-Attach", #i);
                    $ext = dllfuncstr("ToLower", rightstr( $attach, 4 ) );
                    if( $ext == ".zip" ) {
                        $zipfile = dllfuncstr("HomeDir") + dllfuncstr("Curre
ntAccount") + "\\" + $attach;
                        #foundzip = 1;
                        break;
                    }
                    #i = #i + 1;
                }
            }
        }
        if( $password == "" && #foundzip == 0 ) {
            $text = gettext( 0, 0, 999, linecount );        //メール本文全部
            loaddll "HmJre.dll";
            #n = dllfunc("SetUnicodeIndexAutoConvert", 1);      //V1.6 バグ修正
            $text = dllfuncstr("ReplaceRegularNoCaseSense", "[\\r\\n]+", $te
xt, 0, " ", 2);
                        //改行を空白に変換しておく。
            $text = dllfuncstr("ReplaceRegularNoCaseSense", " +", $text, 0,
 " ", 2);
                        //全角空白を半角空白に変換しておく。
            $text = $text + " ";        //末端に空白を付けておく。

            $pattern[0] = " 【パスワード】 *[::]? *([^ \x81\x40-\xFC\xFF]
+?) ";
            $pattern[1] = " 解凍パスワード *[::]? *([^ \x81\x40-\xFC\xFF]
+?) ";
            $pattern[2] = " Password *: *([^ \x81\x40-\xFC\xFF]+?) ";
            $pattern[3] = " \\[パスワード/Password\\] *([^ \x81\x40-\xFC\xF
F]+?) ";
            $pattern[4] = " 【暗号化パスワード\\(password\\)】 *([^ \x81\x40
-\xFC\xFF]+?) ";
            $pattern[5] = " パスワードは「([^ \x81\x40-\xFC\xFF]+?)」";
            $pattern[6] = " 解凍パスワード +([^ \x81\x40-\xFC\xFF]+?) ";
            $pattern[7] = " パスワード *[::] *([^ \x81\x40-\xFC\xFF]+?) ";
            $pattern[8] = " 添付ファイルパスワード *[::]? *([^ \x81\x40-\xF
C\xFF]+?) ";
            $pattern[9] = " \\[(?:パスワード|Password)\\] *([^ \x81\x40-\xFC
\xFF]+?) ";
            $pattern[10] = " パスワード *\\(Password\\) *[::]? *([^ \x81\x4
0-\xFC\xFF]+?) ";
            $pattern[11] = " \\[password information\\] *([^ \x81\x40-\xFC\x
FF]+?) ";
            $pattern[12] = " パスワード[  ]*([0-9]+桁) *[::]? *([^ \x81\
x40-\xFC\xFF]+?) ";
            $pattern[13] = " パスワード[  ]*\\([0-9]+桁\\) *[::]? *([^ \x8
1\x40-\xFC\xFF]+?) ";
            $pattern[14] = " PASSWORD for .{1,255} is below: +([^ \x81\x40-\
xFC\xFF]+?) ";

            #NeedConfirmIndex = 15;     //これ以降のパターンについては確認メ
ッセージを出す。
            $pattern[15] = "パスワード[^ ]*? +([!-~]{4,20}) ";
                            //V1.9寛容性が一番高い。「パスワード」って文字列
があってその後パスワードが別行になってる。
            $pattern[16] = "「+([!-~]{4,20})」";
                            //V1.9「」で囲んだ中にパスワードらしき文字列があ
る場合対応。


            #iPattern = 0;
            #cPassword = 0;
            while(1) {
                $pattern = $pattern[#iPattern];
                if( $pattern == "" ) {
                    break;
                }

                //2021.04.28 新しい方式
                #x = 0;
                while(1) {
                    #x = dllfunc("FindRegularNoCaseSense", $pattern, $text,
#x );
                    if( #x >= 0 ) {
Label_EnterHit: ;
                        $hit = midstr( $text, #x, dllfunc("GetLastMatchLengt
h") );
                        #tag1 = dllfunc("GetLastMatchTagPosition", 1);
                        #tag1len = dllfunc("GetLastMatchTagLength", 1);
                        $pass = midstr( $text, #tag1, #tag1len );
                        //message $hit + "\n" + $pass;
                        if( strlen($pass) >= 4 ) {      //4文字以上でないと
ダメ。
                            //重複チェック
                            if( strstr( $passlist, "\t" + $pass + "\t" ) >=
0 ) {
                                //スキップ
                                goto Label_SkipAddPass;
                            }
                            $password[#cPassword+1] = $pass;        //注意:
+1した所にセットする。
                            $passlist = $passlist + "\t" + $pass + "\t";  //
重複チェック用。
                            $whole[#cPassword+1] = $hit + "\t" + $pass;    
    //注意: +1した所にセットする。
                            #cPassword = #cPassword + 1;
                            if( #cPassword == 1 && #iPattern >= #NeedConfirm
Index ) {
                                #ConfirmPassword = 1;
                            }
Label_SkipAddPass:
                        }
                        #x = #x + 1;
                    } else {
                        break;
                    }
                }
                #iPattern = #iPattern + 1;
            }
            loaddll "tkinfo.dll";       //元に戻す。
        }
    }
    #n = dllfunc("UnlockSelection", 1);
    if( $zipfile == "" ) {
        message "zip形式ファイルが見つかりませんでした。";
        endmacro;
    }

//V1.9 作ったけど没
//  if( #cPassword == 0 ) {
//      ...中身削除。
//  }

    if( $selectedtext != "" ) {
  if( strstr( $passlist, "\t" + $selectedtext + "\t" ) < 0 ) {
         $password[#cPassword+1] = $selectedtext;        //注意: +1した所に
セットする。
         $whole[#cPassword+1] = "(範囲選択した文字列)" + "\t" + $selectedtex
t;         //注意: +1した所にセットする。
         #cPassword = #cPassword + 1;
         #ConfirmPassword = 1;
     }
    }
    if( #cPassword == 0 ) {
        message "パスワードが不明です。\n\nメールを2通選択して、さらにパス
ワードの文字列をメール内容枠中で選択してからマクロ実行すれば、その文字列をパ
スワードとして解凍します。";
        endmacro;
    }
    if( #cPassword > 1 ) {
        $whole[0] = "パスワードの候補が複数見つかりました。どれを使うか選択
してください。";
        menuarray $whole, #cPassword + 1;
        if( result <= 1 ) {
            message "メールを2通選択して、さらにパスワードの文字列をメール
内容枠中で選択してからマクロ実行すれば、その文字列をパスワードとして解凍しま
す。";
            endmacro;
        }
        $password = $password[result-1];        //result == 1の時に$password
[1]を選択する。
    } else {
        $password = $password[1];
        if( #ConfirmPassword == 1 ) {
            question "パスワードは「" + $password + "」でいいですか?";
            if( result != yes ) {
                message "メールを2通選択して、さらにパスワードの文字列を
メール内容枠中で選択してからマクロ実行すれば、その文字列をパスワードとして解
凍します。";
                endmacro;
            }
        }
    }
Label_PasswordDetermined: ;
    if( strstr( $password, "\"" ) >= 0 ) {
        message "パスワードの中にダブルクォーテーションの文字が含まれてます。
このマクロではダブルクォーテーション入りのパスワードで解凍することは出来ませ
ん。手作業で解凍お願いします。";
        endmacro;
    }

    //2021.04.26 unzip.exeがあればそっちを使う。
    //           http://gnuwin32.sourceforge.net/packages/unzip.htm
    //
    $unzip = "C:\\Program Files\\GnuWin32\\bin\\unzip.exe";
    if( ! existfile( $unzip ) ) {
        $unzip = "C:\\Program Files (x86)\\GnuWin32\\bin\\unzip.exe";
        if( ! existfile( $unzip ) ) {
            $unzip = "";
        }
    }

    if( $unzip == "" ) {
        $7zip = "C:\\Program files\\7-Zip\\7z.exe";
        if( ! existfile( $7zip ) ) {
            $7zip = "C:\\Program files (x86)\\7-Zip\\7z.exe";
            if( ! existfile( $7zip ) ) {
                message "7-Zipのプログラム用ファイルが見つかりません。7-Zip
をインストールしてください。\n\n" +
                        "7-Zipは、C:\\Program files\\7-Zip またはC:\\Program
 files (x86)\\7-Zip にインストールされてる必要があります。";
                endmacro;
            }
        }
    }

    openreg "CURRENTUSER","Software\\Microsoft\\Windows\\CurrentVersion\\Exp
lorer\\Shell Folders";
    $outfolder = getregstr("Personal");
    closereg;
    $outfolder = $outfolder + "\\PasswordZipTemp";

    #fsobj = createobject("Scripting.FileSystemObject");
    #folderobj = callmethod_returnobj(#fsobj, "GetFolder", $outfolder + "\\");
    if( #folderobj != 0 ) {
        #subfolderobj = getpropobj(#folderobj, "SubFolders");
        if( #subfolderobj != 0 ) {
            #onefolder = getcollection(#subfolderobj, 2);
            while(1) {
                #onefolder = getcollection(#subfolderobj);
                if( #onefolder == 0 ) {
                    break;
                }
                $subfolder = member(#onefolder, "Name");
                $path = $outfolder + "\\" + $subfolder;
                //テストmessage $path;
                runsync2 "cmd.exe /c rmdir /s /q \"" + $path + "\"";
            }
        }
    }

    #n = dllfunc("Bypass_CreateDirectory", $outfolder);

    if( existfile( $outfolder + "\\*.*" ) ) {
        runsync2 "cmd.exe /c del /f /s /q \"" + $outfolder + "\\*.*\"";    
  //古いファイルのゴミを削除
    }
    #n = dllfunc("Bypass_CreateDirectory", $outfolder);

    if( $unzip != "" ) {
        $command = "\"" + $unzip + "\"" + " -P\"" + $password + "\"" + " -d\
"" + $outfolder + "\" \"" + $zipfile + "\"";
    } else {
        $command = "\"" + $7zip + "\" x -p\"" + $password + "\"" + " -o\"" +
 $outfolder + "\" \"" + $zipfile + "\"";
    }
    #homehidemaru = hidemaruhandle(0);
    #n = dllfunc("NewMail");
    #n = dllfunc("SwitchHeaderView", 0);        //ヘッダ表示なし
    gofiletop;
    beginsel;
    gofileend;
    insert $command + "\n\n";
    gofileend;
    runex $command
            , 1     //同期
            , 0     //標準入力なし
            , ""
            , 5     //標準出力をカーソル位置へ挿入
            , ""
            , 5     //標準エラー出力もカーソル位置へ挿入
            , ""
            , 0     //作業フォルダ指定なし
            , ""
            , 1     //表示あり
            , 0     //描画あり
            , 0     //ANSIで受け取り
            , 0x0001 //2021.05.18 拡張フラグで「%」をそのまま書けるようにする
            ;
    if( !result ) {
        message "unzip.exeまたは7zipの実行に失敗しました。プログラムからの出
力内容を確認してください。";
        endmacro;
    }
    #exitcode = getresultex(9);
    gofileend;
    clearupdated;
    if( #exitcode == 0 || #exitcode == 1 ) {
        //終了コード 参照:
        // 7zip ...      https://sevenzip.osdn.jp/chm/cmdline/exit_codes.htm
        // unzip.exe ... https://community.progress.com/s/article/What-does-Error-Code-mean-on-a-un-Zip-Advanced-Script-1307565966255
        openbyshell $outfolder;
        quit;
    }
    message "unzip.exeまたは7zipからエラーが返っていると思われます。出力結果
を確認してください。";

[ ]
RE:09792 エディタ側でのマクロについてNo.09793
さかみつ さん 22/06/09 15:47
 
ありがとうございます。

今度はすべて!?ばっちりです!!


> まいどどうもです。
> ......
>    message "unzip.exeまたは7zipからエラーが返っていると思われます。出力結
>果を確認してください。";

[ ]
RE:09793 エディタ側でのマクロについてNo.09796
秀まるお2 さん 22/06/09 17:10
 
 確認どうもです。ライブラリにもそろそろアップロードします。

[ ]