【秀丸のマクロなどで】


次の機能を秀丸のマクロなどで実現してください。

《機能》
多重階層構造のフォルダ群があって、各フォルダ内にある複数のテキストファイル
の先頭に固定のテキスト文字列の1行を挿入して上書き保存する。

《条件》
(1)テキストファイルのファイル名は半角数字で、拡張子は無い(1,2,3など)。

(2)拡張子のあるファイルはパスして何も変更しない。
MAILLIST.WML

1.BAK
2.BAK
3.BAK
など

なお、多重階層構造のフォルダの扱いが難しければ、
指定した一つのフォルダだけを対象にした処理でも構いません。
両方の回答者がいれば多重の方のポイントを多くします。

よろしくお願いいたします。
ちなみに、この機能はメーラーの引っ越しに使用します。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2014/04/18 10:32:18
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:siachan No.2

回答回数91ベストアンサー獲得回数23

ポイント175pt

秀丸のマクロで作ってみました

http://pastebin.com/Un6Kh3MY

冒頭の2~6行目が設定なので、環境に合わせて変更してください。

$basedirは、基準ディレクトリの指定でこれ以下のファイルを処理します。
$tempfile、$result、$erroutに関してはディレクトリ名だけ変えればいいと思います(途中で削除するので消えてもいいファイル名で)
$messageはそのままですね

ディレクトリ名に全角文字があっても問題ないですが、unicodeだと駄目みたいですね…

おかしな動作をするかもしれないのでバックアップは忘れずにお願いします(対象外のファイルを編集することはないはずですが)

id:mkonomi

 
siachanさん

秀丸マクロを使用した回答ありがとうございました。
さっそく試させていただきしました。
結果は完璧です。

最後に__result__.txtが未保存の秀丸として表示されているので
名前を付けて保存することができました。
┌───
(1/36)Z:\フルパス1\1. . .成功
(2/36)Z:\フルパス1\10. . .成功
    ・
    ・
(36/36)Z:\フルパス3\9. . .成功

終了
└───
 
---
ひとつのフォルダ内のメールヘッダー付き複数のメールを特定の文字列(※)をセパレ
ータとしてひとつの連続テキストにしておけば、Sylpheedでそれを使用して複数の
メールをまとめて一気にインポートすることができることがわかりました。
siachanさんのコードをお手本にして、それ対応の出力を作るように自分で変更して
みたいと思います。
 
(※)
From dummy@xyz.com
 

2014/04/15 11:28:32

その他の回答1件)

id:foobar_777 No.1

回答回数78ベストアンサー獲得回数18

ポイント125pt

長ったらしいのでPasteBinに貼ってあります
http://pastebin.com/ibNFYA9Q

MHフォルダに対しては動いているので第2階層までは試していませんが、第1階層は動くはずです。
うまく動かないとすると
 ・5行目の拡張子無し(*.)のみ探している
 ・18行目の正規表現: ^[0-9]*$ (ファイル中^^になっているのは^が\相当のエスケープ文字なので)
あたりが怪しいです。
バッチの6行目にpauseを入れると画面が自動で消えなくなるので、画面を上にスクロールしてみると何か解るかもしれません。

#書き込み禁止ではないですよね…

他4件のコメントを見る
id:mkonomi

 
a.batを置いているフォルダ以下のフォルダを階梯を保ったまま
ドライブのルートへコピーして試すと上手くゆきました。
(%%~si を %%i に変更したまま)
 

 

2014/04/15 00:39:55
id:mkonomi

 
パスが半角全角混在でかつパス中に空白がある場合の対処は難しいのでしょうか?
 

2014/04/15 11:33:36
id:mkonomi

 

後だしの条件ですが、書洩らしていましたので追加します。

《条件》

(3)フォルダの名称は半角英数字のフォルダと全角日本語のフォルダが混在している。

 

id:siachan No.2

回答回数91ベストアンサー獲得回数23ここでベストアンサー

ポイント175pt

秀丸のマクロで作ってみました

http://pastebin.com/Un6Kh3MY

冒頭の2~6行目が設定なので、環境に合わせて変更してください。

$basedirは、基準ディレクトリの指定でこれ以下のファイルを処理します。
$tempfile、$result、$erroutに関してはディレクトリ名だけ変えればいいと思います(途中で削除するので消えてもいいファイル名で)
$messageはそのままですね

ディレクトリ名に全角文字があっても問題ないですが、unicodeだと駄目みたいですね…

おかしな動作をするかもしれないのでバックアップは忘れずにお願いします(対象外のファイルを編集することはないはずですが)

id:mkonomi

 
siachanさん

秀丸マクロを使用した回答ありがとうございました。
さっそく試させていただきしました。
結果は完璧です。

最後に__result__.txtが未保存の秀丸として表示されているので
名前を付けて保存することができました。
┌───
(1/36)Z:\フルパス1\1. . .成功
(2/36)Z:\フルパス1\10. . .成功
    ・
    ・
(36/36)Z:\フルパス3\9. . .成功

終了
└───
 
---
ひとつのフォルダ内のメールヘッダー付き複数のメールを特定の文字列(※)をセパレ
ータとしてひとつの連続テキストにしておけば、Sylpheedでそれを使用して複数の
メールをまとめて一気にインポートすることができることがわかりました。
siachanさんのコードをお手本にして、それ対応の出力を作るように自分で変更して
みたいと思います。
 
(※)
From dummy@xyz.com
 

2014/04/15 11:28:32
  • id:foobar_777
    foobar_777 2014/04/14 15:24:37
    秀丸なので環境はWindowsだと思います。OS標準のコマンドを使えばよいのではないでしょうか

    http://pastebin.com/ibNFYA9Q
    (PasteBinに貼ってます。)
    ・21行目を目的の文字列に変更します
    ・全体をメールが置いてある先頭のフォルダに a.bat 等の名前で保存して実行します

    秀丸のマクロが手段ではなく、それ自体が目的であるようでしたらごめんなさい
    #MH(MMH)のフォルダで動作確認しました。
  • id:mkonomi
     
    foobar_777さん
    大変興味あるコメントをありがとうございました。
     
    >秀丸のマクロが手段ではなく、それ自体が目的であるようでしたらごめんなさい
    機能の実現が第一義で、秀丸マクロ使用の軽い期待はありました。
    数年前に少しばかり秀丸のマクロをかじったことがあり、秀丸のマクロで書くとど
    うなるかを見てみたい気持ちがあったからです。
     
    質問文の本文の表現を少しばかり書き換えましたので、
    foobar_777さん、このバッチを回答欄でも紹介してください。
     
    ここで質問ですが、
    21行目↓
    echo 一行目の文字列_これを変更_後ろに空白を入れない> __tmp__
    >・21行目を目的の文字列に変更します
    文字通り21行目全体を目的の文字列に変更するのですか?
    それとも、"一行目の文字列_これを変更_後ろに空白を入れない"の部分を目的の
    文字列に変更するのですか?
    上記いがいですか?

    また「後ろに空白を入れない」とありますが、中間には空白があってもよいのでしょうか?
    具体的な目的の文字列は
    "From dummy@xyz.com"
    で、文字列の中間に空白があります。
     
    他の方で、現在秀丸のマクロでトライ中の方がいらっしゃいましたら、ぜひ回答欄へ紹
    介してください。
     
  • id:mkonomi
     
    >文字通り21行目全体を目的の文字列に変更するのですか?
    >それとも、"一行目の文字列_これを変更_後ろに空白を入れない"の部分を目的の
    >文字列に変更するのですか?
    その後、後者であることがわかりました。
    ただ、目的の文字列を"From dummy@xyz.com"にするとダブルコーテーションも一緒に
    挿入されました。
     
    それから、多重階層のフォルダ構成を追う論理に誤りがありそうです。
     
    RootFolder

    ├─a.bat

    ├─Folder01

    └─Folder02
      │
      └─Folder02_01
     
    で試すと、書き換えられるのは、Folder02_01にあるすべてのファイルだけでした。
    Folder01,Folder02にあるファイルはすべてタイムスタンプも元のままです。
     
  • id:foobar_777
    foobar_777 2014/04/14 19:19:53
    1)From行の追加について
    ""でクオートする必要はありません。次でOKです。From行であるなら後ろ(リダイレクト記号>の前)にスペースが入っても問題ありません。
    echo From: dummy@xyz.com> __tmp__

    2)ディレクトリ再帰するはじめのディレクトリについて
     Folder02_01が起点になってしまっているように見受けられます
     コマンドを起動するカレントディレクトリが起点になりますので、以下のいずれかで試してみてください。
     ・コマンドプロンプトから起動する場合には RootFolder をカレントディレクトリとする
     ・a.batの先頭に「pushd %~dp0」(バッチファイルの場所にcdする)を追加する
     ・バッチファイル(ショートカットはNG)をエクスプローラから起動する
  • id:mkonomi
     
    foobar_777さん
    再度のコメントをありがとうございました。
    ぜひ、回答欄へお願いいたします。

    > 1)From行の追加について""でクオートする必要はありません。次でOKです。
    > From行であるなら後ろ(リダイレクト記号>の前)にスペースが入っても問題
    > ありません。
    > echo From: dummy@xyz.com> __tmp__
    わかりました。
    echo From dummy@xyz.com> __tmp__
    で試して、正しく挿入できました。

    あまり関係ない話なのですが、挿入する行は"From行そのも"ではなく、"コロン抜きの
    From行もどき"で、セパレータの役目をしているようです。

    現在、Windows XPで使っていた骨董品クラスのマイナーなメーラからWindows 8.1で
    の新たなメーラSylpheedへ過去メールをインポートしようとしているところです。

    Sylpheedへインポートできる形式を調べる目的で、まず、Sylpheedからエクスポート
    して形式を見てみると、通常のメールヘッダーのさらにその前に1行コロン抜きの
    From行もどきの行が付加されていました。
    例:
    From Someone@Provider.com Wed Apr 09 21:52:25 2014
    個々のメールごとにそのメールのFrom行とDate行からこのような形式を作るとなると
    かなりの手間だと思い、いろいろ試した結果、個々のメールのヘッダーとは無関係に
    一律に
    From dummy@xyz.com
    だけをセパレータとして付加すればよいことを見出しました。

    メールヘッダー付き複数のメールをこれをセパレータとして連続のテキストにすれば
    複数のメールをまとめて一気にインポートできることもわかりました。

    > 2)ディレクトリ再帰するはじめのディレクトリについて
    >  Folder02_01が起点になってしまっているように見受けられます
    >  コマンドを起動するカレントディレクトリが起点になりますので、以下のいずれかで試してみてください。
    > ・コマンドプロンプトから起動する場合には RootFolder をカレントディレクトリとする
    > ・a.batの先頭に「pushd %~dp0」(バッチファイルの場所にcdする)を追加する
    > ・バッチファイル(ショートカットはNG)をエクスプローラから起動する
    a.batの先頭に1行「pushd %~dp0」を追加し
    more +15 a.bat > __insert_line__.bat

    more +16 a.bat > __insert_line__.bat
    に書き換えました。
     
    ファイル管理プログラム★卓駆でRootFolder直下に配置したa.batをダブルクリックしま
    したが、結果は前と同じで書き換えられるのは、Folder02_01にあるすべてのファイルだ
    けでした。
     
    また、エクスプローラからRootFolder直下に配置したa.batをダブルクリックして起動
    しても同様でした。
     

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません