拡張子違いで本体名は同じファイルを削除No.07127
旧姓山下 さん 12/10/02 13:42
 
こんにちは

数日調べたり試したりしてみたのですが,自分一人ではどうにもいい案が出ません.
ヒントなりとも頂ければ幸いです.

やりたいことは,あるフォルダ(サブフォルダは含まない)内にある pdf ファイル
と txt ファイルの名前について,拡張子を除く本体部分が一致するものがある場合,
pdf ファイルを削除する,ということです.

1)フォルダ内の txt ファイルを全て拾い,拡張子を除いた部分についてのリスト
を作る.
2)フォルダ内の pdf ファイルを全て拾い,順に拡張子を除いた部分が先のリスト
内に存在しないかチェックする.
3)存在していたら,その pdf ファイルを削除する.存在しなければ,その pdf フ
ァイルには何もしない.

この段取りでいいと思うのですが,これを実現する手段が思い当たりません.

田楽dll のヘルプを見まして,
#r = dllfunc("ENUMFILE","*.pdf");
が使えそうかなとも思ったのですが,どうにもなりません.

ここを見ればヒントがあるというアドバイスでも結構です.ご存じの方,よろしくお
願い致します.


[ ]
RE:07127 拡張子違いで本体名は同じファイNo.07128
秀まるお2 さん 12/10/02 15:49
 
 田楽DLLを使わなくても、とりあえずコマンドプロンプト(cmd.exe)で処理さ
せるやり方で出来ると思います。

 適当に作ってみたテストマクロはこんな風になりました。もっと簡単なやり方
があるかもしれませんけども。

 あるいは、そもそも秀丸マクロで無理してやらなくても、Windowsのシェルス
クリプト(=JavaScriptかVisual Basic)でやった方が簡単に出来るのだろなぁ
という気もします。

    newfile;
    run "cmd /c dir /b e:\\temp\\*.pdf >con";
    gofiletop;
    #pdf = hidemaruhandle(0);
    newfile;
    run "cmd /c dir /b e:\\temp\\*.txt >con";
    replaceall "\\.txt$", ".pdf", regular, nocasesense;
    #txt = hidemaruhandle(0);

Loop:
    setactivehidemaru #pdf;
    #y = y;
    golineend2;
    $name = gettext( 0, #y, x, y );
    if( $name == "" ) {
        goto Label_End;
    }
    setactivehidemaru #txt;
    gofiletop;
    searchdown2 "^\\Q" + $name + "\\E$", regular, nocasesense;
    #hit = result;
    if( #hit == 0 ) {
        // not hit
        //ファイル削除
        question $name + "を削除してもいいですか?";
        if( result == yes ) {
            runsync2 "cmd /c del \"e:\\temp\\" + $name + "\"";
        }
    }
    setactivehidemaru #pdf;
    down;
    if( !result ) {
        goto Label_End;
    }
    golinetop2;
    goto Loop;


Label_End:
    message "終了";

[ ]
RE:07128 拡張子違いで本体名は同じファイNo.07129
山紫水明 さん 12/10/02 20:45
 
 旧姓山下さん,
 秀まるお2さん,

deletefile 文がありますので,次のようにはできませんか。
長いファイル名がある場合は少し手直しが必要ですが。
//------------------------------------------------
newfile;
run "cmd /c dir /b *.txt > con";
replaceallfast "txt$", "", regular;
gofiletop;
while( code != eof ) {
    $s = gettext( 0, y, linelen, y );
    $pdf = $s + "pdf";
    if( existfile($pdf) ) {
        question $pdf + "を削除しますか?";
        if( result == yes ) {
            deletefile $pdf, 1;
            #n = #n + 1;
        }
    }
    moveto 0, y + 1;
}
message str(#n) + " 個のPDFファイルを削除しました。";
quit;
endmacro;
//------------------------------------------------

                          山紫水明
                          SANSHISUIMEI

[ ]
RE:07129 拡張子違いで本体名は同じファイNo.07130
旧姓山下 さん 12/10/02 22:42
 
秀まるお2様
山紫明水様

ご回答ありがとうございました.ヒントどころかマクロそのものをお教え頂き,感謝
しております.

お手数をおかけしながら申し訳ないのですが,後学のために何点かお教え頂ければと
存じます.どちら様のマクロについても分からない点はほぼ同じですので,山紫明水
様のマクロを例に質問させて頂きます.

1)マクロを実行すると,秀丸エディタが開き,フォルダ内の txt ファイル一覧
(拡張子抜き)が出ますね.このファイルはどこかに保存されているのでしょうか
(「con」?),それとも保存される前に強制的に消されているのでしょうか.また,
そもそも画面を出さない方法はあるのでしょうか(こっそり一覧を作る).

2)
> run "cmd /c dir /b *.txt > con";
という文がありますが,出力先の「con」とは特別な意味があるのでしょうか.何で
もよかったけれど,たまたま「con」にしたということでしょうか.

3)
> $s = gettext( 0, y, linelen, y );
という文の「y」に初期値が設定されていません.変数一般において,初期値を省く
と自動的に初期値 0 となるのでしょうか.「y」や「x」を使うときだけでしょうか.

4)
> 長いファイル名がある場合は少し手直しが必要ですが。
とありますが,長いファイル名とは255文字以上と理解してよろしいのでしょうか.

以上,本やマクロの解説サイトを見ても分からなかったり,自信が持てない点をお尋
ねさせて頂きました.お時間のあるときにでもお教え頂ければ幸いです.

[ ]
RE:07130 拡張子違いで本体名は同じファイNo.07131
h-tom さん 12/10/02 23:15
 

h-tom です。

>2)
>> run "cmd /c dir /b *.txt > con";
>という文がありますが,出力先の「con」とは特別な意味があるのでしょうか.何で
>もよかったけれど,たまたま「con」にしたということでしょうか.
">con" に関しては、秀丸エディタのヘルプに説明があります。
プログラム実行の詳細(Ver8.20対応版)
http://homepage3.nifty.com/kons/hidemaru/helpsite/hidemaru/html/210_CmdOther_ExecProgram.html

>3)
>> $s = gettext( 0, y, linelen, y );
>という文の「y」に初期値が設定されていません.変数一般において,初期値を省く
>と自動的に初期値 0 となるのでしょうか.「y」や「x」を使うときだけでしょうか.
変数ではありません。キーワードです。
カーソル関連キーワード(Ver8.20対応版)
http://homepage3.nifty.com/kons/hidemaru/helpsite/hidemac/html/060_Keyword_Cursor.html

>そもそも画面を出さない方法はあるのでしょうか(こっそり一覧を作る).
ということなら、秀丸マクロより、Windows Script Host(Jscript、Vbscriot) を使
った方が
いいのでは?

[ ]
RE:07130 拡張子違いで本体名は同じファイNo.07133
IKKI さん 12/10/03 10:18
 
旧姓山下さん、こんにちは。ユーザの IKKI です。

この件、どうしても秀丸マクロでやらざるを得ないのでしょうか?
JScript なら 11 行で書けて、 Windows 上で直接実行できますが。

// clean.js
var fso = WScript.CreateObject("Scripting.FileSystemObject");
var d = fso.GetFolder("Z:\\hoge");
for (var e = new Enumerator(d.Files); !e.atEnd(); e.moveNext()) {
 var f = e.item();
 if (fso.GetExtensionName(f.Name).toLowerCase() == "pdf") {
  txtfilename = f.ParentFolder + "\\" + fso.GetBaseName(f.Path) + ".txt";
  if (fso.FileExists(txtfilename)) {
   fso.DeleteFile(txtfilename);
  }
 }
}

マクロでやるにしても、上記の JScript をどこかに保存しておいて、マクロから
runsync "wscript.exe clean.js"
のように呼び出すのがわかりやすくて良いかと思います。

[ ]
RE:07130 拡張子違いで本体名は同じファイNo.07135
山紫水明 さん 12/10/03 17:14
 

 h-tom さん,フォローありがとうございます。
 皆さんからは他のスクリプトが推奨されていますが,私は残念ながら秀丸マク
ロしか能がありません。(;_;)

>1)マクロを実行すると,秀丸エディタが開き,フォルダ内の txt ファイル一覧
>(拡張子抜き)が出ますね.このファイルはどこかに保存されているのでしょうか
>(「con」?),それとも保存される前に強制的に消されているのでしょうか.

 保存はされていません。
 最後の quit で強制的に破棄しています。ここを exit にすれば保存するかど
うか問い合わせをします。

>そもそも画面を出さない方法はあるのでしょうか(こっそり一覧を作る).

書き出し用のファイルをステルスで開けばいいと思います。
 newfile → openfile "/h";

>4)
>> 長いファイル名がある場合は少し手直しが必要ですが。
>とありますが,長いファイル名とは255文字以上と理解してよろしいのでしょうか.

 この場合は,画面上で折り返されている場合です。折り返されていることもあ
る場合には,表示行単位でなく論理行単位であつかう必要があります。

 以上のことを考慮すれば次のようになるでしょう。
(フォルダ内の任意のテキストファイルを開いて実行。)
//------------------------------------------------
openfile "/h";
run "cmd /c dir /b *.txt > con";
replaceallfast "txt$", "pdf", regular;
gofiletop;
while( code != eof ) {
    $pdf = gettext2( 0, lineno, linelen2, lineno );
    if( existfile($pdf) ) {
        question $pdf + "を削除しますか?";
        if( result == yes ) {
            deletefile $pdf, 1;
            #n = #n + 1;
        }
    }
    movetolineno 1, lineno + 1;
}
message str(#n) + " 個のPDFファイルを削除しました。";
exit;
//------------------------------------------------

                          山紫水明
                          SANSHISUIMEI

[ ]
RE:07130 拡張子違いで本体名は同じファイNo.07137
Tetchiro さん 12/10/03 17:23
 
いちユーザーのTetchiroです。

Windowsのバッチファイル1つで済みますよ。
以下のコマンドを保存したバッチファイルを、目的のフォルダで実行すれば大丈夫か
と。

タイプ1:ダブりがpdfに固定されている場合(.pdfだけ消す)

---------------------------------------
@echo off
for %%A in ("*.txt") do (
  if exist "%%~dpnA.pdf" del "%%~dpnA.pdf"
)
pause
---------------------------------------

タイプ2:ダブりの種類が不明な場合(.txt以外全部消す)
---------------------------------------
@echo off
for %%A in ("*.txt") do (
  for %%B in ("%%~dpnA.*") do (
    if not "%%~xB"=="%%~xA" del "%%~fB"
  )
)
pause
---------------------------------------

参考までに、
 "*.txt"をフォルダ指定にすれば(例:"C:\ABC\*.txt")、別のフォルダで実行し
ても大丈夫です。
 「"」は、スペース入りフォルダに対応させるためのおまじない。
 forループはecho文の")"で崩れてしまうので、もしかしたら名前に「)」が入って
いるフォルダ/ファイルだとエラーになるかも。

[ ]
RE:07137 拡張子違いで本体名は同じファイNo.07138
旧姓山下 さん 12/10/03 21:36
 
h-tom 様,IKKI 様,山紫水明様,Tetchiro 様

ご回答ありがとうございました.

日中サイトを見られず,今見て色々な方法があるものだとびっくりしました.どなた
様もありがとうございます.


h-tom 様,説明の所在,よく分かりました.ご紹介のサイトは質問前に一応見たので
すが,問題の箇所を探せませんでした.

秀丸のマクロには,変数とは別に「キーワード」という概念があるのですね.説明を
一読しただけではよく理解できませんでしたが,折りを見て勉強しておきたいと思い
ます.


IKKI 様,秀丸マクロに限る必然性はありません.秀丸エディタでテキストファイル
を開いているとき,不要になった PDF をその場で消せれば楽だなと思っただけです.
JScript とは聞いたことはありますが,これでプログラミングしようという発想は全
くありませんでした.

なお,お教え頂いた JScript を実行してみましたが,「スクリプトファイル "C:\...
\clean.js" が見つかりません」というメッセージが出てきます.

fso.GetFolder("Z:\\hoge");

の中身を clean.js の置き場に変えてみましたが,見つからなかったようです.


山紫水明様

ありがとうございました.希望通りの動きでした.最後の exit の前に quit を入れ
るべきなのでしょうね.


Tetchiro 様

これは当該フォルダに移ってからコマンドプロンプトを立ち上げて実施するのだと思
いますが,「%%A の使い方が誤っています」というエラーが出てきます.当方,Wind
ows 7 を使用しております.


以上,皆様お忙しい中,色々とお知恵をお貸し頂き,誠にありがとうございました.
私には今のところ理解不能なところもありますが,勉強させて頂きます.

[ ]
RE:07138 拡張子違いで本体名は同じファイNo.07139
h-tom さん 12/10/03 22:09
 

h-tom です。

>h-tom 様,説明の所在,よく分かりました.ご紹介のサイトは質問前に一応見たので
>すが,問題の箇所を探せませんでした.
紹介したサイトは、秀丸エディタ付属のヘルプと同じ内容です。
・メニュー その他 → 秀丸エディターヘルプ
・メニュー マクロ → マクロヘルプ

ヘルプには、検索機能もあるので、検索も出来ます。
また、「秀丸エディタ マクロ言語(入門用)ヘルプ」(be_hidemac.chm)も、
標準で添付されていますよ。

[ ]
RE:07138 拡張子違いで本体名は同じファイNo.07140
Tetchiro さん 12/10/04 09:22
 
Tetchiroです。

>これは当該フォルダに移ってからコマンドプロンプトを立ち上げて実施するのだと
>思いますが,「%%A の使い方が誤っています」というエラーが出てきます.当方,W
>indows 7 を使用しております.

毎回入力するのは面倒なのでバッチファイルにしておくほうが便利です。
なので、バッチファイル用の文法を記入していますので、コマンドプロンプトで直接
入力すると文法違反になります。
(コマンドプロンプトだと、連続%%の部分を単独%にすれば大丈夫)

「abc.bat」とか作ってやって、中身を
-----------BAT本文は次行から----------------------------
@echo off
for %%A in ("*.txt") do (
  if exist "%%~dpnA.pdf" del "%%~dpnA.pdf"
)
pause
-----------BAT本文は前行まで----------------------------
と入力しておく。
あとは、このファイルをダブルクリックなどで実行してやれば、目的が
達成できると思います。
一応、XP、2003server、7で問題なく動いていますよ。

参考:コマンドプロンプトで、
 help for
と打つと、forの使い方が分かります。
しかし、バッチファイル上で使う場合には%を%%と2つにしなさいとは書かれていな
いので、念のため、バッチ用の文法にしています。
(自分もこの罠にはまった口なので)

[ ]
RE:07140 拡張子違いで本体名は同じファイNo.07143
旧姓山下 さん 12/10/04 21:40
 
h-tom 様,Tetchiro 様

ご回答ありがとうございました.

「マクロヘルプ」があったんですね.マクロ登録は何度もしているのですが,その直
下にあるメニューは全く意識に残っておりませんでした.

マクロのことはウェブで調べるしかないと思い込んでおりました.


>なので、バッチファイル用の文法を記入していますので、コマンドプロンプトで直
>接入力すると文法違反になります。

ありがとうございました.バッチファイルなどもう何年も作っておらず,文法を完全
に忘れており,言われても「そうだったっけ?」という感じがしております.とにか
く,動かし方が分かり,助かりました.

[ ]