←前へ 次へ→
機能別Ｑ＆Ａ 質問番号順Ｑ＆Ａ 目次

# [HMM0084A]

## ●フォルダにある複数のファイルにマクロを実行したい

  フォルダにある複数のファイルに、マクロを実行したいのですが可能でしょうか？

  秀丸マクロ単独では、フォルダ内のファイルをリストアップする方法はありません。
  対象のファイルが少なければ、個別にファイルを開いてマクロを実行するのが簡単です。

  秀丸マクロ単独では無理ですが、外部プログラム DLL COMコンポーネントを使えば、指定したフォルダ内ファイルをリストアップすることは可能です。

  - 外部プログラムを使う方法　その1

    コマンドプロンプトからバッチファイルを使います。(Windows 10 20H2 の コマンドプロンプトで確認)

    バッチファイルで対象ファイルをリストアップし、起動オプションを指定して秀丸エディタを起動します。ただし、実行するマクロ内で秀丸エディタを閉じないと次のファイルに進みません。 (自動で連続実行させたい場合は、マクロ内で exit や quit 等を使い、秀丸エディタを閉じる必要がある)

        @echo off
        @rem 拡張機能を有効にする。
        setlocal enableextensions

        @rem 秀丸エディタのパスと、実行するマクロを指定する
        set HIDEMARU=C:\Program Files\Hidemaru\Hidemaru.exe
        set MACRO=_test.mac

        @rem 引数を変数にセット
        set SEARCHFILES=%~1

        @rem 引数がない場合はデフォルトとして、"*.txt" をセットする。
        if "%SEARCHFILES%" == "" set SEARCHFILES=*.txt

        @rem 対象ファイルをリストアップし、秀丸エディタに渡す。
        @echo on
        @for /F "usebackq" %%a IN (`dir /b /A-d-r-h "%SEARCHFILES%"`) do start "" /wait "%HIDEMARU%" /x "%MACRO%" "%%~fa"

        @rem バッチファイルをダブルクリックで実行する場合、以下の行を有効に(@rem を削除)しないとエラーがあってもわからない
        @rem pause

    以下の箇所は自分の環境に合わせて編集してください。秀丸エディタのある場所と実行するマクロを指定します。

        @rem 秀丸エディタのパスと実行するマクロを指定する
        set HIDEMARU=C:\Program Files\Hidemaru\Hidemaru.exe
        set MACRO=_test.mac

    デフォルトでは フォルダ 読み取り専用ファイル 隠しファイル をリストアップしません。 for文にある `dir` の `/A` オプション部分を変更するとリストアップするファイルを変更できます。詳細は コマンドプロンプトで `dir /?` を実行して表示される内容を確認してください。

        dir /b /A-D-R-H

    編集した内容を、「macro_files.cmd」という名前で保存します。

    バッチファイルを実行する時は、引数を指定します。指定しない場合は、"*.txt" を指定した事になります。指定したマクロを「C:\temp」にある拡張子が「txt」のファイル全てに実行したい場合は、コマンドプロンプトへ以下のように入力します。

        >macro_files.cmd C:\temp\*.txt

    リストアップされるファイルを確認するには、バッチファイルを一部変更して実行します。

    変更前

        @for /F "usebackq" %%a IN (`dir /b /A-d-r-h "%SEARCHFILES%"`) do start "" /wait "%HIDEMARU%" /x "%MACRO%" "%%~fa"

    変更後

        @for /F "usebackq" %%a IN (`dir /b /A-d-r-h "%SEARCHFILES%"`) do @echo "%%~fa"

    変更後、バッチファイルを実行するとリストアップされるファイル名が表示されます。

  - 外部プログラムを使う方法　その2

    PowerShellから、PowerShellスクリプトを使います。(Windows 10 20H2 の PowerShell 7.1.2 で動作確認済み)

    PowerShellスクリプトで対象ファイルをリストアップし、起動オプションを指定して秀丸エディタを起動します。ただし、実行するマクロ内で秀丸エディタを閉じないと次のファイルに進みません。 (自動で連続実行させたい場合は、マクロ内で exit や quit 等を使い、秀丸エディタを閉じる必要がある)

    PowerShell はバージョンによりスクリプトを実行ができない場合があります。その場合は、スクリプトを実行できるようにPowerShellを設定してください。

        Param(
            [parameter(mandatory=$true)][String]$FilePath ,
            [String]$FileFilter = "*.txt"
        )

        #秀丸エディタのパスと、実行するマクロを指定する
        $hidemaru = "C:\Program Files\Hidemaru\Hidemaru.exe"
        $macro    = "_test.mac"

        $list = Get-ChildItem -File -Path $FilePath -Filter $FileFilter -Attributes !D+!H+!R+!S

        $arg = @('/x', $macro, '')
        foreach($files in $list){
            $arg[2] = $files.fullname
            Start-Process -FilePath $hidemaru -ArgumentList $arg -Wait
        }

    以下の箇所は、自分の環境に合わせて編集してください。秀丸エディタのある場所と、実行するマクロを指定します。

        #秀丸エディタのパスと、実行するマクロを指定する
        $hidemaru = "C:\Program Files\Hidemaru\Hidemaru.exe"
        $macro    = "_test.mac"

    デフォルトでは フォルダ 読み取り専用ファイル 隠しファイル システムファイルはリストアップしません。 `Get-ChildItem` の `-Attributes` オプション部分を変更すると、リストアップするファイルを変更できます。詳細は PowerShell で `Help Get-ChildItem` を実行してください。

        $list = Get-ChildItem -File -Path $FilePath -Filter $FileFilter -Attributes !D+!H+!R+!S

    編集した内容を、「macro_files.ps1」という名前で保存します。

    スクリプトを実行する時は、引数を指定する必要があります。

    「_test.mac」を「C:\temp」にある拡張子が「txt」のファイル全てに実行したい場合は、コマンドプロンプトへ以下のように入力します。(引数は2つです。)

        ps > .\macro_files.cps1 "C:\temp" "*.txt"

    ファイルの指定を省略すると、"*.txt"と同じになります。

        ps > .\macro_files.ps1 "C:\temp"

    リストアップされるファイルを確認するには、スクリプトを一部変更して実行します。

    変更前

        Start-Process -FilePath $hidemaru -ArgumentList $arg -Wait

    変更後

        echo $files.fullname

    変更後、スクリプトを実行するとリストアップされるファイルが表示されます。

  - COMコンポーネントを使う方法

    秀丸エディタのマクロから、標準でOSにある FilesytemObject を使ってファイルをリストアップしマクロを実行します。

        //  ファイル一覧を取得するサンプルマクロ

        //デバック時は、以下の行のコメントを外すこと
        debuginfo 2;

        #MB_OK               = 0x00;
        #MB_OKCANCEL         = 0x01;
        #MB_ABORTRETRYIGNORE = 0x02;
        #MB_YESNOCANCEL      = 0x03;
        #MB_YESNO            = 0x04;
        #MB_RETRYCANCEL      = 0x05;
        #MB_ICONSTOP         = 0x10;
        #MB_ICONQUESTION     = 0x20;
        #MB_ICONEXCLAMATION  = 0x30;
        #MB_ICONINFORMATION  = 0x40;

        #IDOK     = 1;
        #IDCANCEL = 2;
        #IDABORT  = 3;
        #IDRETRY  = 4;
        #IDIGNORE = 5;
        #IDYES    = 6;
        #IDNO     = 7;

        $MESSAGETITLE = "マクロ:" + currentmacrobasename;

        //ファイル一覧の取得
        //取得したいフォルダ
        $Searchfolder = @"C:\TEMP";
        //取得したいファイルの拡張子。
        //複数ある場合は";"で区切って指定する。
        //全てのファイルを対象にする場合は""にする。
        $Searchfile = "txt";

        call GetFileList $Searchfolder, $Searchfile;
        #max = ##return;
        #cnt = 0;
        #main = hidemaruhandle(0);
        debuginfo sprintf("#max=%d\n", #max);
        while(#max > #cnt){
            //ファイルのリストは、$FileList[#cnt] で取得できる
            debuginfo sprintf("%03d:%s\n", #cnt, $FileList[#cnt]);
            openfile $FileList[#cnt];
            if(result == true){
                #open = hidemaruhandle(0);
            }else{
                message "ファイルを開くのに失敗しました。\n" + $FileList[#cnt], $MESSAGETITLE;
                break;
            }
            //実行したいマクロを記述する。
            //ただし exit、quit、endmacroal、saveexit、saveexitall、等マクロを終了させる命令は含ませないこと。
            //ここから
            execmacro "_test.mac";

            //ここまで
            if(updated){
                #ret = message("更新されています。保存しますか？", $MESSAGETITLE, #MB_YESNO|#MB_ICONQUESTION, 5000, #IDNO);
                if(#ret == #IDYES) save;
            }
            //ファイルを切り替え
            setactivehidemaru #main;

            //開いたファイルを閉じない場合は以下をコメントにする事
            closehidemaruforced #open;
            #cnt = #cnt + 1;
        }
        endmacro;

        //指定されたフォルダから、指定された拡張子を持つファイルをリストアップする。
        //  引数1 ：フォルダ
        //  引数2 ：拡張子。複数指定する場合は、";"で区切ること。
        //  戻り値：リストアップしたファイル数。エラーが発生した場合は、-1を返す。
        //  $FileListという配列にリフトを格納する。
        GetFileList:
            $$Searchfolder = $$1;
            $$Searchfile   = $$2;

            ##ATTR_READONLY  = 0x00000001;  //読み取り専用ファイル
            ##ATTR_HIDDEN    = 0x00000002;  //隠しファイル
            ##ATTR_SYSTEM    = 0x00000004;  //システムファイル
            ##ATTR_DIRECTORY = 0x00000010;  //フォルダの場合セットされるビット
            ##ATTR_ARCHIVE   = 0x00000020;  //バックアップ操作対象ファイル

            //フォルダのチェック
            if(existfile($$Searchfolder, 1) & ##ATTR_DIRECTORY == 0){
                message "指定されたフォルダが見つかりません。\n" + $$Searchfolder, $MESSAGETITLE;
                return -1;
            }

            //拡張子のチェック
            if($$Searchfile != ""){
                $$Searchfile = ";" + tolower($$Searchfile) + ";";
            }else{
                $$Searchfile = "";
            }

            //FileSystemObject の取得
            ##WshFso = createobject("Scripting.FileSystemObject");
            if(##WshFso == 0){
                message "Scripting.FileSystemObject が取得できませんでした。", $MESSAGETITLE;
                return -1;
            }
            //フォルダーオブジェクトの取得
            ##Folder = callmethod_returnobj(##WshFso, "GetFolder", $$Searchfolder);
            if(##Folder == 0){
                message "フォルダオブジェクト が取得できませんでした。", $MESSAGETITLE;
                return -1;
            }
            //ファイルコレクションの取得
            ##Files  = getpropobj(##Folder,"Files");
            if(getresultex(10) == false){
                message "ファイルコレクション が取得できませんでした。", $MESSAGETITLE;
                return -1;
            }
            //ファイルコレクションを読み出し
            ##cnt = 0;
            while(true){
                ##File = getcollection(##Files);
                //ファイルオブジェクトを取得できなければ、ループを抜ける
                if(##File == 0) break;
                //パスを取得
                $$get_filepath = getpropstr(##File, "Path");
                call DBOUT "file=" + $$get_filepath;
                //ファイル属性チェック
                ##file_attr = getpropnum(##File, "Attributes");
                ##Check_attr = (##ATTR_HIDDEN | ##ATTR_READONLY | ##ATTR_SYSTEM);
                if((##file_attr & ##Check_attr) == 0){
                    //拡張子を取得
                    $$get_ext = callmethod_returnstr(##WshFso, "GetExtensionName", $$get_filepath);
                    //対象ファイル化チェック
                    if(strlen($$Searchfile) > 0){
                        $$get_ext = tolower($$get_ext);
                        if(strstr($$Searchfile, ";" + $$get_ext + ";") > -1){
                            $FileList[##cnt] = $$get_filepath;
                            ##cnt = ##cnt + 1;
                        }
                    }else{
                        $FileList[##cnt] = $$get_filepath;
                        ##cnt = ##cnt + 1;
                    }
                }
            }
            ##File = getcollection(##Files, 3);
            releaseobject ##Files;
            releaseobject ##Folder;
            releaseobject ##WshFso;
        return ##cnt;

    以下の箇所は、自分の環境に合わせて編集してください。ファイル一覧を取得したいフォルダと、拡張子を設定します。

        //ファイル一覧の取得
        //取得したいフォルダ
        $Searchfolder = @"C:\TEMP";
        //取得したいファイルの拡張子。
        //複数ある場合は";"で区切って指定する。
        //全てのファイルを対象にする場合は""にする。
        $Searchfile = "txt";

    実行したいマクロは以下の「//ここから」「//ここまで」の間に記述するか、 `execmacro` で呼び出すか、`call` でサブルーチンとして呼び出してください。

    コメントにも書きましたが、秀丸エディタを閉じる命令があるとその時点で止まるので注意してください。

        //実行したいマクロを記述する。
        //ただし exit、quit、endmacroal、saveexit、saveexitall、等マクロを終了させる命令は含ませないこと。
        //ここから
        execmacro "_test.mac";

        //ここまで

    デフォルトでは 読み取り専用ファイル 隠しファイル システムファイルはリストアップしません。 `##Check_attr` を変更すればリストアップできます。

        ##Check_attr = (##ATTR_HIDDEN | ##ATTR_READONLY | ##ATTR_SYSTEM);

←前へ｜次へ→
機能別Ｑ＆Ａ 質問番号順Ｑ＆Ａ 目次