指定した文字列の挿入No.06738
toro2008 さん 11/08/22 23:11
 
任意のフォルダにある複数のファイル(例えば、「*.txt」のようにワイルドカード
を使うなど)を指定して、任意の行に指定した文字列を一括挿入する方法はあります
か?
03/01/16 22:36
http://maruo.dyndns.org:81/hidesoft/hidesoft_4/x03531.html

上記に山紫水明さまによりマクロがお示しされています。
ただファイルが空ファイルのテキストや改行のみの場合は、うまく動いてくれません。
空ファイルのテキストや改行のみの場合でもうまくいく方法はありますでしょうか?
お忙しいところ恐縮ですが、よろしくお願い申し上げます。

-----以下引用-----
山紫水明 さん 03/01/19 22:03  
 sylpheedさん,こんばんは。
》できれば、保存のところで最初に「保存しますか?」で確認して「yes」で保存、
》「no」で保存しないというのが理想です。
 次のでどうでしょう。
//------------------------------------------------//
//  複数ファイルの指定行に指定文字列を挿入するマクロ
//  目的のファイルの一つを開いて実行

question "挿入マクロを実行しますか?";
if( result == no ) endmacro;
$s = input( "挿入文字列は?" );
if( $s == "" ) endmacro;
#ime = imestate;
if( #ime ) imeswitch;
#line = val( input( "挿入する行は" ) );
$folder = input( "指定フォルダは", directory );
$ext = input( "ファイルの拡張子は", ".txt" );
$file0 = filename;
#handle0 = hidemaruhandle( 0 );
grep ".", "*" + $ext, $folder, regular, filelist;
replaceallfast "\\(1\\)\\n", "\\n", regular;
#handle_g = hidemaruhandle( 0 );
#c = linecount2 - 1;
gofiletop;
while( #i < #c ) {
    golinetop2;
    beginsel;
    golineend2;
    $f = gettext( seltopx, seltopy, selendx, selendy );
    openfile $folder + "\\" + $f;
    #handle1 = hidemaruhandle( 0 );
    movetolineno 1, #line;
    insert $s + "\n";
    if( #i == 0 ) {
        question "すべて保存しますか?";
        if( result ) save;
        else break;
    } else save;
    #i = #i + 1;
    setactivehidemaru #handle_g;
    closehidemaruforced #handle1;
    movetolineno 1, lineno + 1;
}
openfile $file0;
closehidemaruforced #handle_g;
if( #ime ) imeswitch;
message "終わりました。\n" + str(#i) + " 個のファイルを処理しました。";
endmacro;
//------------------------------------------------//

     では, (^^)/~
                                        山紫水明
----引用ここまで-----

[ ]
RE:06738 指定した文字列の挿入No.06739
秀丸担当 さん 11/08/23 11:42
 

>ただファイルが空ファイルのテキストや改行のみの場合は、うまく動いてくれません。
>空ファイルのテキストや改行のみの場合でもうまくいく方法はありますでしょうか?
>お忙しいところ恐縮ですが、よろしくお願い申し上げます。

空の内容でできないのは、秀丸エディタのマクロで使われる常套手段としてファ
イル一覧の取得にgrepを使っているためです。
grepで全ての文字にヒットするようにしてその一覧を取得している方法なので、
空のファイルでは取得できなです。
改行だけの場合は、"."ではなく"^"とするとできます。

例:
  grep "^", "*" + $ext, $folder, regular, filelist;

grepを使わない場合は、いろいろファイル一覧の取得方法はあります。
例:
・マクロサーバを使う
・杉浦まさきさん作の田楽DLLまたは田楽サーバを使う(マクロサーバ互換)
・run "cmd.exe /c dir >con";をして整形する
・その他外部ソフトを使う
外部ソフトを導入したりと、いろいろ面倒ではあります。


V8.00以降では、COMに対応したことで、WSHで使われるファイル一覧取得の方法
も秀丸マクロ化して使えます。
この方法の場合は外部ソフトを導入したりせずに使えます。
例えば、元のマクロのgrep文を以下のように置き換えます。

  //grep ".", "*" + $ext, $folder, regular, filelist;
  call FileList $ext, $folder;

マクロの末尾(endmacroの後)に以下のサブルーチンを追加します。

  FileList:
  newfile;
  $extParam = $$1;
  $folderParam = $$2;
  if(leftstr($extParam,1)=="."){
    $extParam=rightstr($extParam,strlen($extParam)-1);
  }
  #objFs = createobject("Scripting.FileSystemObject");
  #objFolder = member( #objFs, "GetFolder", $folderParam );
  #objFiles = member( #objFolder, "Files" );
  while( 1 ) {
    #objFile = getcollection( #objFiles );
    if( #objFile == 0 ) break;
    $path = member( #objFile, "Path" );
    $ext = member( #objFs, "GetExtensionName", $path );
    $ext = tolower($ext);
    if( $ext == $extParam ) { //*.txt
      insert member( #objFs, "GetFileName", $path ) + "\n";
    }
  }
  return;

[ ]
RE:06739 指定した文字列の挿入No.06740
toro2008 さん 11/08/23 23:03
 
秀丸担当さま、ありがとうございました。
ご教示いただきました以下の方法にてうまく実行処理されました。
>V8.00以降では、COMに対応したことで、WSHで使われるファイル一覧取得の方法

「指定した文字列の挿入」に関して完全解決させていただきました。
誠にありがとうございました。

全く別件になるのですが、もう一つだけご教示いただけましたら幸いです。
わたしが「指定した文字列の挿入」に関して前段で行っているcmd.exeの処理に関し
て、ひょっとして秀丸上マクロでできるのかなと思いお尋ねさせてくださいませ。
>・run "cmd.exe /c dir >con";をして整形する
「指定した文字列の挿入」に関して頂いたアドバイスの中に上記コメントがありマク
ロでcmd.exeの実行ができることを知りました。

複数の空ファイルに任意コメントを追加する前に任意のフォルダに指定したファイル
名で空ファイルをcmd.exeで作成しています。
これまでの私の方法は、
1.任意フォルダに指定したファイル名で空ファイルをcmd.exeで作成
2.正規表現が使えるファイル置換ソフトdevasで行頭”^”を指定して「指定した文
字列の挿入」を行っていました。
3.秀丸でそれぞれのファイルに処理すべきテキストを貼り付け様々なマクロ処理を行
いテキストを整形し、最終的にExcelに貼り付け統計処理を行うという過程です。
今回ご教示頂いたことで2.に関して秀丸上ででき、もし、1.が秀丸上でマクロ実行処
理できれば非常にsmoothに仕事がはかどります。

-----この度ご教示頂きたいマクロ-----
cmd.exeを起動し、cdで任意のフォルダに移動し、任意のフォルダにはあらかじめlis
t.txt作成しておき、list.txtには作成したいファイル名リストを入力しておく。そ
の上でfor /F %i in (list.txt) do type nul > %iを実行する。
この「任意のフォルダに指定したファイル名で空ファイル作成」処理を秀丸マクロで
実行できますと非常にありがたいです。

上記のうちリストファイルはあらかじめ作成しておく場合がマクロとしては妥当でし
ょうか、もしマクロの流れで作成可能ならばありがたいですが。

度々お手を煩わせ恐縮ですが、よろしくお願い申し上げます。

[ ]
RE:06740 指定した文字列の挿入No.06741
秀丸担当 さん 11/08/24 09:26
 

>cmd.exeを起動し、cdで任意のフォルダに移動し、任意のフォルダにはあらかじめlis
>t.txt作成しておき、list.txtには作成したいファイル名リストを入力しておく。そ
>の上でfor /F %i in (list.txt) do type nul > %iを実行する。
>この「任意のフォルダに指定したファイル名で空ファイル作成」処理を秀丸マクロで
>実行できますと非常にありがたいです。
>

一応バッチファイルの実行はrun文にそのまま書いてできます。
run "test.bat";
このままだと並行して動いてしまうので、runsync2のほうがいいと思います。
runsync2 "test.bat";

標準出力を得る場合はとします。
run "cmd /c test.bat >con";
標準出力は必要じゃないけどコマンドプロンプトがちらついて邪魔な場合は
run "cmd /c test.bat >nul";
とします。
「>con」や「>nul」をつけるとrunsync2と同様に同期します。
一方runsync2では「>con」や「>nul」は指定できません。(ややこしくてすみま
せん)


これを書いていて気づきましたが、ファイル一覧の取得はCOMを使わなくても、
run "cmd /c dir /b *.txt >con";
とするとファイル一覧の整形処理の必要なく一覧を出力できて、こっちのほうが
楽でした。

[ ]
RE:06741 指定した文字列の挿入No.06742
toro2008 さん 11/08/24 22:04
 
秀丸担当さま、度々ありがとうございます。
ご教示頂いたことを参考にマクロを実行してみましたが、結果現在のところうまくい
っておりません。試しに秀丸上マクロではなく、単なるbatファイルとして管理者権
限で実行してもうまくいきません。ところが、コマンドプロンプトから実行するとう
まくいきます。なぜだろう?
以下に状況をご報告いたします。
秀丸上でlist.macの実行結果
F:\任意1\任意2\任意3>type nul  
F:\任意1\任意2\任意3>type nul  
F:\任意1\任意2\任意3>type nul  
F:\任意1\任意2\任意3>type nul  
F:\任意1\任意2\任意3>type nul  
F:\任意1\任意2\任意3>type nul  
F:\任意1\任意2\任意3>type nul  
F:\任意1\任意2\任意3>type nul  
F:\任意1\任意2\任意3>type nul  
F:\任意1\任意2\任意3>type nul  

以下、list.macの中身
run "cmd /c for /f %i in (list.txt) do type nul >%i >con";
実行結果としては、ファイルが作成されずに終了してしまいます。

コマンドプロンプトから実行結果では
F:\任意1\任意2\任意3>for /f %i in (list.txt) do type nul >%i
上記コマンドを実行すると、

F:\任意1\任意2\任意3>type nul  1>test01.txt
F:\任意1\任意2\任意3>type nul  1>test02.txt
F:\任意1\任意2\任意3>type nul  1>test03.txt
F:\任意1\任意2\任意3>type nul  1>test04.txt
F:\任意1\任意2\任意3>type nul  1>test05.txt
F:\任意1\任意2\任意3>type nul  1>test06.txt
F:\任意1\任意2\任意3>type nul  1>test07.txt
F:\任意1\任意2\任意3>type nul  1>test08.txt
F:\任意1\任意2\任意3>type nul  1>test09.txt
F:\任意1\任意2\任意3>type nul  1>test10.txt

となり、うまくlist.txtのファイルリストから上記のテキストファイルが作成されま
す。

以下、list.txtの中身
test01.txt
test02.txt
test03.txt
test04.txt
test05.txt
test06.txt
test07.txt
test08.txt
test09.txt
test10.txt

なお、list.txtは、F:\任意1\任意2\任意3\list.txtにあります。

如何でしょうか?お忙しいところ恐縮ですが、もう少しおつきあい頂けると幸いです。

[ ]
RE:06742 指定した文字列の挿入No.06743
秀丸担当 さん 11/08/25 09:16
 

Google検索などをしてみたところ、バッチファイルでfor文を使う場合は%は%%と
書かなくてはいけないようです。
あとcmd /cのあとのfor文記述では%も%%も使えないようです。

●バッチファイル
for /f %%i in (list.txt) do type nul >%%i

●コマンドライン直接
for /f %i in (list.txt) do type nul >%i

●cmd /c は使えない
cmd /c for /f %i in (list.txt) do type nul >%i

なぜこういう違いがあるのかはわからないですが、上記3つは全てコマンドライ
ン上からの実行の話です。
秀丸エディタのマクロからでは、バッチファイルを使う選択しかなさそうです。

[ ]
RE:06743 指定した文字列の挿入No.06744
Kaisan さん 11/08/25 09:56
 
kaisan@ユーザです。
> ●cmd /c は使えない
> cmd /c for /f %i in (list.txt) do type nul >%i
これは
  cmd /c "for /f %i in (list.txt) do type nul >%i"
で動きます。
マクロの場合
  run "cmd /c \"for /f %i in (list.txt) do type nul >%i\" >con"
かな?(試していません)


> なぜこういう違いがあるのかはわからないですが、上記3つは全てコマンドライ
> ン上からの実行の話です。
解釈されるタイミングの問題です。
※正規表現で「\」を検索したい場合、マクロでは「\\\\」と書く必要があるのと
 同じ理屈です。

[ ]