[ 新規に投稿する ]

フォルダ内のファイルに同じ処理をするマクロNo.00622
ワイワイ さん 21/02/07 16:07 [ コメントを投稿する ]
お疲れ様です。
当方プログラム初心者なのですが、
秀丸マクロのリファレンスを読んでも
フォルダ内のファイルに同じ処理をするマクロする方法が思いつかず、
すみませんがどのようなコードを書けばいいのか教えていただけませんでしょうか?
[ ]
RE:00622 フォルダ内のファイルに同じ処理をするマクロNo.00623
h-tom さん 21/02/07 21:20 [ コメントを投稿する ]
  h-tom です。

>フォルダ内のファイルに同じ処理をするマクロする方法が思いつかず、
秀丸エディタのマクロで、フォルダ内のファイルを列挙する方法は提供されていません。
その為、マクロ内でフォルダ内のファイルを列挙するには、外部DLLやCOMコンポーネントを使う必要があります。

実行するマクロに注意が必要ですが、コマンドプロンプトからバッチファイルを使うのが簡単です。
http://htom.in.coocan.jp/hmfaq8/4_cmdlin.html#CMD
[ ]
RE:00622 フォルダ内のファイルに同じ処理をするマクロNo.00624
Iranoan さん 21/02/07 22:23 [ コメントを投稿する ]
  ワイワイさんこんにちは Iranoan です
> 秀丸マクロのリファレンスを読んでも
> フォルダ内のファイルに同じ処理をするマクロする方法が思いつかず、
> すみませんがどのようなコードを書けばいいのか教えていただけませんでしょうか?
最近常用してませんが
> 複数ファイルにマクロ実行 Ver.1.07
> 開いている全てのファイル、若しくは特定のフォルダにあるファイルに対して、任意のマクロを纏めて実行します 
http://iranoan.my.coocan.jp/hidemaru/macro/batchmac107.zip
を公開しています
[ ]
RE:00622 フォルダ内のファイルに同じ処理をするマクロNo.00625
秀まるお さん 21/02/07 23:14 [ コメントを投稿する ]
   runexで「dir /a-d /b」ってコマンドを実行するとファイル名一覧が取得できるので、そこから1つ1つファイルを開いてマクロ実行するってタイプのマクロを一回作ってみました。

 execmacro "test2.mac"の所は適当に直さないといけないですけども。

 かなりシンプルかと思いますけども。

    runex "cmd.exe /c dir /a-d /b"
    , 1     //sync   0:async, 1:sync
    , 0, "" //stdin  0:none, 1:auto, 2:<file, 3:(reserved),
            //       4:current content, 5:selection
    , 4, "" //stdout 0:none, 1:auto, 2:>file 3:>>file, 4:new window,
            //       5:insert, 6:replace, 7:>output pane, 8:>>output pane
    , 0, "" //stderr 0:none, 1:auto or >>stdout, 2-8:same as stdout's param
    , 0, "" //folder 0:none, 1:current, 2:specify 3:(reserved), 4:exe's
    , 1     //show   0:auto, 1:show, 2:hide, 3-13:ShellExecute()'s SW_*
    , 1     //draw   0:draw, 1:no draw when stdout redirected
    , 0     //encode 0:ansi, 2:utf-16, 6:utf-8
    , 0     //extended flags
    ;
    config "xAutoAdjustOrikaeshi:2";
    gofiletop;
    #base = hidemaruhandle(0);
    while( code != eof ) {
        $filename = gettext( 0, y, 999, y );
        openfile $filename;
        message $filename;
        execmacro "test2.mac";
        #handle = hidemaruhandle(0);
        setactivehidemaru #base;
        closehidemaru #handle;
        down;
    }
    message "終了。この内容(ファイル一覧)は閉じてください。";
[ ]
RE:00623 フォルダ内のファイルに同じ処理をするマクロNo.00626
ワイワイ さん 21/02/07 23:43 [ コメントを投稿する ]
>h-tom です。
> ......
>http://htom.in.coocan.jp/hmfaq8/4_cmdlin.html#CMD

回答ありがとうございます。
こちらの方法試してみます。
[ ]
RE:00625 フォルダ内のファイルに同じ処理をするマクロNo.00627
ワイワイ さん 21/02/07 23:44 [ コメントを投稿する ]
>Iranoanさん

>秀まるおさん

ご回答ありがとうございます。
1つ1つこちら試させていただきます。
[ ]
RE:00623 フォルダ内のファイルに同じ処理をするマクロNo.00628
ワイワイ さん 21/02/11 22:29 [ コメントを投稿する ]
>h-tom です。

h-tomさん
お疲れ様です。
情報教えていただきありがとうございます。
ですが、こちらのコマンドプロンプトを試したのですが何も実行されませんでした。特にエラーメッセージも出ないので原因もよくわかりません。
当方windows10で作業しております。

作成したバッチ
-------------------------------------------
@echo off
setlocal enabledelayedexpansion
cd %~dp0
if not "%1" == "" goto MAIN
echo *.txt
goto :EOF

:MAIN
for %%a in (%1) do start "" /wait "C:\Program Files (x86)\Hidemaru" /x number.mac "%%a"
-------------------------------------------

作成したマクロ
-------------------------------------------------
//編集以外の情報をできるだけ変えないようにする
setcompatiblemode 0x00420200;
//カーソルを位置をリセットする
moveto 0,0;
//文字列の変数(開始番号が決まる)
#number = 1;
//連番を挿入したい文字列を記入
searchdown "^..." , regular, nocasesense, hilight;
//連番を入れたい数字を記入
while ( result ){
 //3桁の連番を条件分岐で入れる
 if( #number <= 9 ){
  moveto foundendx, foundendy;
  insert "00";
  //数字型を文字列型に変換する関数
  insert str(#number);
  #number = #number + 1;
  finddown;
 }
 else if (10 <= #number <= 99 ){
  moveto foundendx, foundendy;
  insert "0";
  //数字型を文字列型に変換する関数
  insert str(#number);
  #number = #number + 1;
  finddown;
 }
 else if (100 <= #number <= 999 ){
  moveto foundendx, foundendy;
  //数字型を文字列型に変換する関数
  insert str(#number);
  #number = #number + 1;
  finddown;
 }
}
saveexit
-------------------------------------------------
[ ]
RE:00624 フォルダ内のファイルに同じ処理をするマクロNo.00629
ワイワイ さん 21/02/11 22:34 [ コメントを投稿する ]
>http://iranoan.my.coocan.jp/hidemaru/macro/batchmac107.zip
>を公開しています

Iranoanさん。
情報提供ありがとうございます。
こちらのマクロ使用してみました。
ファイル名には*.txtというワイルドカードを入れればいいのでしょうか。
ですが、実際に試したところ、batchmac0は編集中のファイルのみマクロが実行され、batchmac1ではマクロは実行されませんでした。

作成したマクロに問題があるのでしょうか?
当方の作業環境はwindows10となっております。

-----------------------------------------
//編集以外の情報をできるだけ変えないようにする
setcompatiblemode 0x00420200;
//カーソルを位置をリセットする
moveto 0,0;
//文字列の変数(開始番号が決まる)
#number = 1;
//連番を挿入したい文字列を記入
searchdown "^..." , regular, nocasesense, hilight;
//連番を入れたい数字を記入
while ( result ){
 //3桁の連番を条件分岐で入れる
 if( #number <= 9 ){
  moveto foundendx, foundendy;
  insert "00";
  //数字型を文字列型に変換する関数
  insert str(#number);
  #number = #number + 1;
  finddown;
 }
 else if (10 <= #number <= 99 ){
  moveto foundendx, foundendy;
  insert "0";
  //数字型を文字列型に変換する関数
  insert str(#number);
  #number = #number + 1;
  finddown;
 }
 else if (100 <= #number <= 999 ){
  moveto foundendx, foundendy;
  //数字型を文字列型に変換する関数
  insert str(#number);
  #number = #number + 1;
  finddown;
 }
}
saveexit
-------------------------------------------------
[ ]
RE:00623 フォルダ内のファイルに同じ処理をするマクロNo.00630
ワイワイ さん 21/02/12 02:25 [ コメントを投稿する ]
>h-tom です。
>

h-tomさん。お疲れ様です。
失礼しました。
先ほど投稿した内容ですが、パスがexeファイルまで通っておりませんでした。
ただ、exeファイルまで通しても結局は動かなかったので、結果は変わりませんでした。
[ ]
RE:00630 フォルダ内のファイルに同じ処理をするマクロNo.00631
h-tom さん 21/02/12 05:57 [ コメントを投稿する ]
  h-tom です。

>先ほど投稿した内容ですが、パスがexeファイルまで通っておりませんでした。
>ただ、exeファイルまで通しても結局は動かなかったので、結果は変わりませんでした。

バッチファイルで状況を表示させたい場合は
> @echo off
を削除するか、

> REM @echo off
上記の様に修正して、実行してください。

> setlocal enabledelayedexpansion
特に必要ないのでは?

> cd %~dp0
カレントドライブが異なると、うまく動きませんよ。
/d オプション追加するか、引き数をパス付きで指定するか。(例 C:\TEMP\*.txt)
まぁ、状況次第ですが。
[ ]
RE:00631 フォルダ内のファイルに同じ処理をするマクロNo.00632
h-tom さん 21/02/12 06:33 [ コメントを投稿する ]
  h-tom です。

> > cd %~dp0
> カレントドライブが異なると、うまく動きませんよ。
> /d オプション追加するか、引き数をパス付きで指定するか。(例 C:\TEMP\*.txt)

チョットわかりづらいので修正
>/d オプション追加するか、

> cd /d "%~dp0"
ということです。ダブルクォートも追加した方が良さそうですが。

> 引き数をパス付きで指定するか。(例 C:\TEMP\*.txt)
こちらは、バッチファイルの引数のことです

バッチファイルを確認するなら
> for %%a in (%1) do start "" /wait "C:\Program Files (x86)\Hidemaru" /x number.mac "%%a"を
> for %%a in (%1) do echo "%%a"
に変更して、目的のファイル名が表示されるか確認した方がいいですよ。
間違ったファイル加工するのも怖いので。
[ ]
RE:00632 フォルダ内のファイルに同じ処理をするマクロNo.00635
ワイワイ さん 21/02/14 21:59 [ コメントを投稿する ]
>h-tom です。

h-tomさん。回答ありがとうございます。
cmdのログには以下のように出るので、
飛んでいないように見えます……。

パスの省略\test>C:\Users\butya\yuichi\work\program\test\folder_all.bat
パスの省略\test>rem @echo off
パスの省略\test>cd /d "C:\Users\butya\yuichi\work\program\test\"
パスの省略\test>if not "" == "" goto MAIN
パスの省略\test>echo *.txt
*.txt
パスの省略\test>rem 引数にワイルドカードの値が入る
パスの省略\test>goto :EOF


ワイルドカードの*.txtに該当するファイルは存在しているのですが……。
こちら、パスの問題ではないのではないでしょうか?
[ ]
RE:00632 フォルダ内のファイルに同じ処理をするマクロNo.00636
ワイワイ さん 21/02/14 22:01 [ コメントを投稿する ]
>h-tom です。
>

※本文修正したので再送しました。
h-tomさん。回答ありがとうございます。
cmdのログには以下のように出るので、
ラベルのMAINに飛んでいないように見えます……。

パスの省略\test>C:\Users\butya\yuichi\work\program\test\folder_all.bat
パスの省略\test>rem @echo off
パスの省略\test>cd /d "C:\Users\butya\yuichi\work\program\test\"
パスの省略\test>if not "" == "" goto MAIN
パスの省略\test>echo *.txt
*.txt
パスの省略\test>rem 引数にワイルドカードの値が入る
パスの省略\test>goto :EOF


ワイルドカードの*.txtに該当するファイルは存在しているのですが……。
こちら、パスの問題ではないのではないでしょうか?
[ ]
RE:00636 フォルダ内のファイルに同じ処理をするマクロNo.00637
h-tom さん 21/02/14 22:56 [ コメントを投稿する ]
  h-tom です。

>cmdのログには以下のように出るので、
>ラベルのMAINに飛んでいないように見えます……。
MAIN には飛んでませんね。

説明にも書いてありますが、汎用的使うため、バッチファイルには引数が必要です。
>上記内容をバッチファイルとして保存しワイルドカードを引数に指定して実行すると、
>ワイルドカードにマッチしたファイルに対しマクロ(実行するマクロ.mac)を実行します。
バッチファイルの実行例(?)があった方がよさそうなので、説明は追加しておきます。

>if not "" == "" goto MAIN
上記は、引数の有無を調べて、引数があればMAINに飛ばしています。

>パスの省略\test>C:\Users\butya\yuichi\work\program\test\folder_all.bat
バッチファイル起動時に引数を指定してないので、MAINに飛んでいません。

バッチの起動方法を以下のようにするか、
>パスの省略\test>C:\Users\butya\yuichi\work\program\test\folder_all.bat *.txt

引数を指定しなくても動くようにバッチファイル自体を変更する必要があります。
> cd /d "%~dp0"
> for %%a in (*.txt) do @echo "%%a"

「*.txt」をパス付きで指定(例 D:\temp\*.txt)すれば、「cd /d "%~dp0"」は不要なんですけどね。
(フルパスで渡すか、ファイル名だけ渡すかの違い)
うまくファイルをリストアップできたら、秀丸エディタを指定してください。
[ ]
RE:00637 フォルダ内のファイルに同じ処理をするマクロNo.00642
ワイワイ さん 21/02/20 23:48 [ コメントを投稿する ]
>h-tom です。
>

h-tomさん。
お疲れ様です。引数を入れてバッチを実行したら無事マクロが
想定通り実行されました。
ありがとうございます!

1点
>引数を指定しなくても動くようにバッチファイル自体を変更する必要があります。

こちらの部分だけうまくいきませんでした。
for %%a in (*.txt) do @echo "%%a"
てっきり変数aに配列が入っているのかと思ったのですが……。
[ ]
RE:00642 フォルダ内のファイルに同じ処理をするマクロNo.00643
h-tom さん 21/02/21 08:59 [ コメントを投稿する ]
  h-tom です。

>こちらの部分だけうまくいきませんでした。
どう、うまくいかなかったのでしょうか?

バッチファイルとしては以下の2行になります。
> cd /d "%~dp0"
> for %%a in (*.txt) do @echo "%%a"

1行目をなくして「*.txt」をパス付きで指定(例 D:\temp\*.txt)した時、
空白を含む場合は、"D:\te  mp\*.txt" のように、「"」で囲む必要がありますけどね。
[ ]
RE:00643 フォルダ内のファイルに同じ処理をするマクロNo.00648
ワイワイ さん 21/02/23 17:07 [ コメントを投稿する ]
>h-tom です。
> ......
>空白を含む場合は、"D:\te  mp\*.txt" のように、「"」で囲む必要がありますけどね。

ご回答ありがとうございます。
理解力が無く申し訳ございません。
その2行のバッチファイルで何をするのか理解できなく。
一応、そのバッチを作成して叩いてみましたが、
何も起こりませんでした。

また、以下のように作成したコードに組み込んで使用するのか試したのですが、
うまくいきませんでした。

rem @echo off
cd /d "%~dp0"
rem 変数aにファイルの値を入れる
for %%a in (*.txt) do @echo "%%a"
if not "%a" == "" goto MAIN
echo *.txt
rem 引数にワイルドカードの値が入る
goto :EOF
rem %aは引数を参照している
rem for文の変数は、%%iのように、アルファベット1文字を用いた特殊な記法となる
:MAIN
for %%a in (%b) do start "" /wait "C:\Program Files (x86)\Hidemaru\Hidemaru.exe" /x "C:\Users\butya\AppData\Roaming\Hidemaruo\Hidemaru\Macro\number.mac" "%%b"
rem for %%a in (%a) do echo "%%a"
pause

[ ]
RE:00648 フォルダ内のファイルに同じ処理をするマクロNo.00649
h-tom さん 21/02/23 19:10 [ コメントを投稿する ]
  h-tom です。

>その2行のバッチファイルで何をするのか理解できなく。

> cd /d "%~dp0"
バッチファルがあるフォルダにカレントフォルダを移動
> for %%a in (*.txt) do @echo "%%a"
for文が カレントフォルダにある (*.txt) にマッチするファイル名を 1個ずつ %%a に渡していくるので、echo %%a で表示。

>一応、そのバッチを作成して叩いてみましたが、
>何も起こりませんでした。
ファイル名を表示させるだけですが、何も表示されていないと言うことですか?

> for %%a in ("*.*") do @echo "%%a"
にすれば、少なくともバッチファイル名は表示されるはず。
これでも何のエラーメッセージもでていなくて、なにも教示されないならわかりません。

>また、以下のように作成したコードに組み込んで使用するのか試したのですが、
>うまくいきませんでした。
組み込む必要はないです。

echo文を使っているのは、以下の理由ですよ。
> バッチファイルを確認するなら
> > for %%a in (%1) do start "" /wait "C:\Program Files (x86)\Hidemaru" /x number.mac "%%a"
> を
> > for %%a in (%1) do echo "%%a"
> に変更して、目的のファイル名が表示されるか確認した方がいいですよ。
> 間違ったファイルを加工するのも怖いので。

対象が固定なら、バッチファイルは以下の一文だけで済みます。
> for %%a in ("目標のフォルダ\*.目標の拡張子") do start "" /wait "C:\Program Files (x86)\Hidemaru\Hidemaru.exe" /x "number.mac" "%%a"
[ ]
RE:00649 フォルダ内のファイルに同じ処理をするマクロNo.00650
ワイワイ さん 21/02/23 21:53 [ コメントを投稿する ]
>h-tom です。
> ......
>> for %%a in ("目標のフォルダ\*.目標の拡張子") do start "" /wait "C:\Program Files (x86)\Hidemaru\Hidemaru.exe" /x "number.mac" "%%a"

h-tomさん。
お疲れ様です。回答ありがとうございます。
意図を理解しました。
pause
の一文を最後に追加して、一覧が見れるようになりました。

また、教えていただいたバッチファイルでも正常に動きました。
こちらもありがとうございます!
[ ]

[ 新規に投稿する ]