- ベストアンサー
バッチコマンドで改名
環境:Windows 2000Pro 現在、拡張子を変換するのに以下のような処理をしています。 1)変換対象ファイルの一覧をバッチ・ファイルとして保存。 // bak_lst.cmd ---------------------------- ren E:\Test\Sample.txt Sample.bak ren E:\Test\Sample02.txt Sample02.bak : // bak_lst.cmd -END ----------------------- 2)起動用バッチ・ファイル(to_bak.cmd)からCALL文で(1)にて作成したバッチ・ファイルを呼び出す。 // to_bak.cmd --------------- @echo off call E:\Test\bak_lst.cmd // to_bak.cmd -END ---------- ■ これを、 1)変換対象ファイルの一覧は、ファイル名のみの羅列でテキストファイルとして保存。 // bak_lst.txt ------------ E:\Test\Sample.txt E:\Test\Sample02.txt : // bak_lst.txt -END ------- 2)バッチ・ファイルで(1)にて作成したテキストファイルを読み込んで拡張子の変換を実行。 //???.cmd: for %%f in (E:\Test\list.txt) do ren ・・・ // 結果 ------------------- E:\Test\Sample.bak E:\Test\Sample02.bak : // 結果 -END -------------- と言うように、出来るでしょうか? 厚かましい質問ですが、よろしくお願いいたします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
以下のようにすれば望みのことができます。 #Windows2000 sp2で確認済 /* 1.cmd for /F %%a in (bak_lst.txt) do call rencmd.cmd %%a /* rencmd.cmd for /F "tokens=1,2 delims=." %%b in ("%1") do rename %%b.%%c %%b.bak #但し上記方法では、対象ファイルが同一フォルダ内かフォルダ名に「.」が #複数入っていないことが条件です。
その他の回答 (4)
- mann555
- ベストアンサー率46% (29/62)
delims で指定出来るのは文字列では無く単一の文字です。 tokens の解釈はそれであっています。 あとtokens の指定で tokens=1,2* とすると 分割したtokenの2番目以降を2つ目の変数に全部渡すことが出来ます。 (今回だと %Cに) また以下の方法でファイルリスト使う方法の替わりが出来ます /+ for /F %%a in (bak_lst.txt) do call rencmd.cmd %%a の替わり FOR /F "usebackq " %%i IN (`dir /B *.txt`) DO call rencmd.cmd %%i #上記はCMDバッチと対象のファイルが同一のフォルダにあるものとしています。
お礼
複数の質問に回答していだだき、ありがとうございました。 お陰で、for文の理解度がアップしました。
- K-1
- ベストアンサー率21% (832/3844)
「特定の拡張子を持った一覧ファイルに記述されたファイル全てを特定拡張子に変換する」というのでしたら sedやawkを組み合わせれば可能です。 ファイル一覧として ---- list.txt ----- aaaaa.txt bbbbb.txt cccb.txt ---- list.txt ----- と書かれているとします。 バッチとスクリプトとして ---- reext.bat ----- sed -f sp list.txt >tmp awk -f sp2 tmp >tmp.bat call tmp.bat del tmp del tmp.bat ---- reext.bat ----- ---- sp ----- s/.txt//g ---- sp ----- ---- sp2 ----- {printf("ren %s.txt %s.bak\n", $0, $0)} ---- sp2 ----- この3つのファイルをつくり、reext.batを実行すると list.txtの中のファイルが aaaaa.txt -> aaaaa.bak bbbbb.txt -> bbbbb.bak cccb.txt -> cccb.bak とリネームされるはずです。
お礼
実は、この改名処理は某エディタのマクロから呼び出す形で実行しておりまして、そのマクロではバッチコマンドではなくて、Perlスクリプトを呼び出しています。 しかし、出来るならソフト(Perl)に依存することなくOS標準の機能で簡単に、且つ、スマートに出来ないかと思い質問した次第です。お手を煩わしてすみません。 sed, awkのサンプルソースまで用意していただき、ありがとうございました。
BATファイルはそういうことをするものではないので、やりたいのであればWSHを勉強した方が近道です。 リファレンスでよければマイクロソフトのページに掲載されていますので、そこを見てみてください。 2000には最初からWSHが入ってるはずです。 --------------------○ TargetFile="bak_lst.txt" Set fso = CreateObject("Scripting.FileSystemObject") Set bkl = fso.OpenTextFile(TargetFile,1) Do While bkl.AtEndOfLine = False lFile = bkl.ReadLine If fso.FileExists(lFile) = True Then nFile = Replace(lFile, ".txt", ".bak") fso.MoveFile lFile, nFile End If Loop --------------------○ サンプルってことでこういうの作ってみました。 「----○」の範囲内を to_bak.vbs というファイル名で保存し、bak_lst.txt をこのファイルと同じフォルダに作って to_bak.vbs をダブルクリックします。するとbak_lst.txt の中に記載されたファイルがすべて、bak に置き換わります。 ただしこれはあくまでサンプルなので、ファイルは .txt のみ対象です。また、対象ファイルは必ずフルパスで記載されていなければならず、ファイル名のどこかに拡張子以外で「.txt」という文字が含まれていると誤動作します。
お礼
> BATファイルはそういうことをするものではないので はい、バッチ処理の得手、不得手と言うものが全く理解できていません。 WSHは「勉強しよう」と思った事もあるのですが、それより先にPerlに飛びついてしまいました。 「それなら、最初からPerlでやれよ!」というお叱りを受けそうですが、この改名処理は某エディタのマクロから呼び出す形で実行しております。 ですので、出来るならソフト(Perl)に依存することなくOS標準の機能(WSHも標準?)で簡単に、且つ、スマートに出来ないかと思い質問した次第です。お手を煩わしてすみません。 WSHのサンプルソースまで用意していただき、ありがとうございました。 WSHも勉強してみます。
- inoue64
- ベストアンサー率29% (334/1115)
たぶんそういうことはできないと思います。
お礼
そうですか。 彼是やってもエラーばかりが返ってくるので質問したんですが、残念です。 回答ありがとうございました。
お礼
出来ました。(うれしい!) リファレンスの「for文」項目で「tokens, delims」などは認識していたのですが、いまいち私には理解出来ていませんでした。 delims = 引数を指定文字列でスプリット(分割) tokens = スプリットされた要素の配列インデックス(的?) と解釈しましたが、間違っていませんか?