• ベストアンサー

バッチコマンドで改名

環境: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 -------------- と言うように、出来るでしょうか? 厚かましい質問ですが、よろしくお願いいたします。

  • Bo_Bo
  • お礼率72% (78/108)

質問者が選んだベストアンサー

  • ベストアンサー
  • mann555
  • ベストアンサー率46% (29/62)
回答No.4

以下のようにすれば望みのことができます。 #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 #但し上記方法では、対象ファイルが同一フォルダ内かフォルダ名に「.」が #複数入っていないことが条件です。

Bo_Bo
質問者

お礼

出来ました。(うれしい!) リファレンスの「for文」項目で「tokens, delims」などは認識していたのですが、いまいち私には理解出来ていませんでした。 delims = 引数を指定文字列でスプリット(分割) tokens = スプリットされた要素の配列インデックス(的?) と解釈しましたが、間違っていませんか?

その他の回答 (4)

  • mann555
  • ベストアンサー率46% (29/62)
回答No.5

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バッチと対象のファイルが同一のフォルダにあるものとしています。

Bo_Bo
質問者

お礼

複数の質問に回答していだだき、ありがとうございました。 お陰で、for文の理解度がアップしました。

  • K-1
  • ベストアンサー率21% (832/3844)
回答No.3

「特定の拡張子を持った一覧ファイルに記述されたファイル全てを特定拡張子に変換する」というのでしたら 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 とリネームされるはずです。

Bo_Bo
質問者

お礼

実は、この改名処理は某エディタのマクロから呼び出す形で実行しておりまして、そのマクロではバッチコマンドではなくて、Perlスクリプトを呼び出しています。 しかし、出来るならソフト(Perl)に依存することなくOS標準の機能で簡単に、且つ、スマートに出来ないかと思い質問した次第です。お手を煩わしてすみません。 sed, awkのサンプルソースまで用意していただき、ありがとうございました。

noname#25358
noname#25358
回答No.2

 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」という文字が含まれていると誤動作します。

参考URL:
http://www.microsoft.com/japan/developer/scripting/
Bo_Bo
質問者

お礼

> BATファイルはそういうことをするものではないので はい、バッチ処理の得手、不得手と言うものが全く理解できていません。 WSHは「勉強しよう」と思った事もあるのですが、それより先にPerlに飛びついてしまいました。 「それなら、最初からPerlでやれよ!」というお叱りを受けそうですが、この改名処理は某エディタのマクロから呼び出す形で実行しております。 ですので、出来るならソフト(Perl)に依存することなくOS標準の機能(WSHも標準?)で簡単に、且つ、スマートに出来ないかと思い質問した次第です。お手を煩わしてすみません。 WSHのサンプルソースまで用意していただき、ありがとうございました。 WSHも勉強してみます。

  • inoue64
  • ベストアンサー率29% (334/1115)
回答No.1

たぶんそういうことはできないと思います。

参考URL:
http://www1.plala.or.jp/tsune/2msdos.html#c_for
Bo_Bo
質問者

お礼

そうですか。 彼是やってもエラーばかりが返ってくるので質問したんですが、残念です。 回答ありがとうございました。

関連するQ&A

  • MS-DOSバッチファイルコマンドのrenを使用してファイル名を置換することができない

    MS-DOSバッチファイルコマンドのrenを使用して sample1__01.txt と sample2__02.txt の __(アンダーバー2個)を_test_に置換して、sample1_test_01.txt とsample2_test_02.txt が 自動でできあがるようにしたいのですがうまくいきません。 見よう見まねで ren *__*.txt *_test_*.txt と書いて実行させてみたのですが sample1__test_.txt と sample2__test_.txt となってしまいます。 どうすれば思いどうりの結果を得ることができるのでしょうか? ご存知の方がおられましたらご回答をよろしくお願いします。

  • Windowsのバッチについて

    お世話になります。 Windowsのバッチについてアドバイスをいただけますでしょうか。 ある文字列の書かれているファイルを1つ作成して「拡張子のあるもの」、「無いもの」2種類を作成したいと考えています。 例) 拡張子の無いもの:test01~test3000 拡張子のあるもの:text01.txt~text3000.txt 3000個と大量のファイルが必要なためechoとcopyコマンドを使って次のように指定しましたが、 ■sample.batの中身 ========================== echo testdata > test01 echo testdata > test02 echo testdata > test03 echo testdata > test04 echo testdata > test05 ~中略 copy test01 > test01.txt copy test02 > test02.txt copy test03 > test03.txt copy test04 > test04.txt copy test05 > test05.txt ~以下省略 ========================== 実際に作成された拡張子”.txt”の方を見てみると 次のように記載されており正しくファイルをコピーできません。 ■test01.txt~test05.txtの中身 =================================================== ファイルを同じファイルにコピーすることはできません。 0 個のファイルをコピーしました。 =================================================== どのようにすればファイルコピーを正しく行うことが出来ますでしょうか。 また、この方法では実際にbatファイルの編集に時間がかかってしまうためあまり実用的ではありません。 もし、他に良い方法があればアドバイスをいただけますと幸いです。

  • バッチファイルで

    バッチファイルでファイル名をキーボードで変更するのは どうすればよいのでしょうか 例:A.txtと言うファイル名をキーボードから2006data.txtにしたいのですが REN C:\A.txt 2006data.txt はわかるのですが2006.txtを変数にして その変数をキーボードで入力する方法(今更バッチファイルでもないのですが?) よろしくお願いします。

  • ファイルのバッチ処理について

    バッチ処理を勉強しているところです。 ひとつの問題が解決できていないので、わかるひとは教えて もらえませんか? C:\bom.txtがあって、C:\temp\a.txtとC:\temp\d.txt, C:\temp\a\a.txt と C:¥temp\b\e.txtもあります。 for でC:\bom.txtファイルとほかのファイルと再帰的に結合して、 ファイル名はそのままにしたいですが、 @set bomfilepath=C:\ 考えているバッチは以下のようになるが、失敗しました。 for /R %1 %%f in (*.*) do @( @rem echo %%f call copy /B %bomfilepath%bom.txt+%%f %%ftemp call del /Q %%f ren %%ftemp %%f ) 原因はどこですか?

  • バッチファイル 2ファイルをfor /f処理したい

    バッチファイルで別の2つのファイルを読み込んでfor /f処理するには 変換前のファイルのファイル名と 変換後のファイルのファイル名が それぞれ別のファイルに書かれていて この2つのファイルを読み込んで リネームするバッチファイルを 記述したいのですが 2つのfor /fを使った場合、 一方が他方にネストされてしまうのですが このような場合は どのように記述するのでしょうか。 例えば、 変換前のファイル名が書かれたファイル(s.txt)と 変換後のファイル名が書かれたファイル(d.txt) がある場合、 abc.txtをqrs.txt d f.txtをtuw.txt ghi.txtをx z.txt  : にリネームしたいのですが もちろんtest1.batではうまくいきません。 ---test1.bat------------------- for /f %%a in (s.txt) do for /f %%b in (d.txt) do ren "%%a" "%%b" ------------------------------ ---s.txt---------------------- abc.txt d f.txt ghi.txt : ---d.txt---------------------- qrs.txt tuw.txt x z.txt : ------------------------------ 以下の sd.txt のように1つのファイルにして test2.bat のようにすればできますが s.txt と d.txt の2つのファイルのままで処理するには どのように記述すればよいのでしょうか。 ---test2.bat------------------- for /f "tokens=1,2 delims=," %%a in (sd.txt) do ren "%%a" "%%b" ---sd.txt---------------------- abc.txt,qrs.txt d f.txt,tuw.txt ghi.txt,x z.txt : ------------------------------- よろしくお願いします。(Windows7)

  • コマンドプロンプトのバッチについて

    test01.bat >> YYMMDD結果.txt コマンドプロンプトのバッチ処理を実行結果をテキストで保存したいのですが、ファイル名を、 「YYMMDD結果.txt」と"YYMMDD"に本日の日にちを入れたいのですが、どのようにすればよいのでしょうか?

  • バッチファイルでファイル名をリネームのコマンド

    お世話になります。 バッチファイルのコマンドについて質問させていただきます。 【やりたいこと】 AAA.batというバッチファイルと”MU_日付.txt”というテキストがあります。 このテキストの日付部分は毎回変わります。例)MU_111226.txt このバッチファイルとMU_日付.txtは同じ階層にあります。 まず、このAAA.batをクリックしたら、この”MU_111226.txt” を ”読み込み.txt” という名前にリネームします。このリネーム処理の時、テキスト名が”MU”で始まるファイル以外は対象にしないようにしたいのです。 次にある処理を行って、その処理が済んだら”読み込み.txt”を”END_MU_111226.txt”といった元のファイル名に”END_”を付けた形でリネームして、同じ階層にある「処理済み」フォルダへ移動させたいのです。 ”END_” + ”元のファイル名”が無理であれば、”MU_111226.txt”を「処理済み」フォルダへ移動させるだけでも構いません。 このような処理は可能でしょうか? どなたかご教授いただけますでしょうか。よろしくお願い致します。

  • WindowsNT,Windows2000のバッチファイル

    おしえてください。 WindowsNT,Windows2000で作成するバッチファイルの拡張子は 「.bat」、「.cmd」のどちらがベターですか? WindowsNT,Windows2000でバッチファイルを作成して 実行したいのですが、そのバッチファイルの拡張子として (1)「.bat」、(2)「.cmd」の2種類で実行可能と認識しています。 私は (1)「.bat」は「command.com」、(2)「.cmd」は「cmd.exe」より動作すると 思っています。 よって(1)「.bat」だと16ビットで動作するため、何たかの不具合がでないのかなと懸念しています。 (1)「.bat」、(2)「.cmd」どちらでもいいのなら現在つくっている (1)「.bat」でいきたいのですが・・・。 どうかご回答お願いします。

  • コマンドプロンプトでファイル名に含まれるスペースを別の文字に置換したい

    コマンドプロンプトでファイル名に含まれるスペースを別の文字に置換したい BAT実行や、BATにドロップする程度の操作でファイル名置換したいと思っています。 たとえば、「abcTEST123.txt」というファイルを下記のバッチにドロップすると、 「abctest123.txt」と言うファイル名に置換されます。 for %%A in (*TEST*.txt) do call :sub %%A :sub set A=%1 ren %A% %A:TEST=test% しかし「TEST」をスペースにしてもファイル名の置換はできません。 コマンドプロンプトではスペースは扱えないのでしょうか。 解決策がありましたらご教授願います。

  • バッチファイルでファイル名をリネームのコマンドにつ

    お世話になります。 バッチファイルのコマンドについて質問させていただきます。 【やりたいこと】 AAA.batというバッチファイルと”MU_日付.txt”というテキストがあります。 このテキストの日付部分は毎回変わります。例)MU_111226.txt このバッチファイルとMU_日付.txtは同じ階層にあります。 まず、このAAA.batをクリックしたら、この”MU_111226.txt” を ”読み込み.txt” という名前にリネームします。このリネーム処理の時、テキスト名が”MU”で始まるファイル以外は対象にしないようにしたいのです。 次にある処理を行って、その処理が済んだら”読み込み.txt”を”END_MU_111226.txt”といった元のファイル名に”END_”を付けた形でリネームして、同じ階層にある「処理済み」フォルダへ移動させたいのです。 ”END_” + ”元のファイル名”が無理であれば、”MU_111226.txt”を「処理済み」フォルダへ移動させるだけでも構いません。 このような処理は可能でしょうか? どなたjかご教授いただけますでしょうか。よろしくお願い致します。