OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

バッチコマンドで改名

  • 暇なときにでも
  • 質問No.109722
  • 閲覧数596
  • ありがとう数5
  • 気になる数0
  • 回答数5
  • コメント数0

お礼率 72% (75/103)

環境: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
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.4
レベル9

ベストアンサー率 46% (29/62)

以下のようにすれば望みのことができます。
#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

お礼率 72% (75/103)

出来ました。(うれしい!)
リファレンスの「for文」項目で「tokens, delims」などは認識していたのですが、いまいち私には理解出来ていませんでした。

delims = 引数を指定文字列でスプリット(分割)
tokens = スプリットされた要素の配列インデックス(的?)

と解釈しましたが、間違っていませんか?
投稿日時 - 2001-07-27 19:46:24
-PR-
-PR-

その他の回答 (全4件)

  • 回答No.1
レベル13

ベストアンサー率 29% (334/1115)

たぶんそういうことはできないと思います。 ...続きを読む
たぶんそういうことはできないと思います。
お礼コメント
Bo_Bo

お礼率 72% (75/103)

そうですか。
彼是やってもエラーばかりが返ってくるので質問したんですが、残念です。

回答ありがとうございました。
投稿日時 - 2001-07-26 19:54:39

  • 回答No.2

 BATファイルはそういうことをするものではないので、やりたいのであればWSHを勉強した方が近道です。  リファレンスでよければマイクロソフトのページに掲載されていますので、そこを見てみてください。  2000には最初からWSHが入ってるはずです。 --------------------○ TargetFile="bak_lst.txt" Set fso = Creat ...続きを読む
 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」という文字が含まれていると誤動作します。
お礼コメント
Bo_Bo

お礼率 72% (75/103)

> BATファイルはそういうことをするものではないので
はい、バッチ処理の得手、不得手と言うものが全く理解できていません。

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

WSHのサンプルソースまで用意していただき、ありがとうございました。
WSHも勉強してみます。
投稿日時 - 2001-07-26 19:58:14
  • 回答No.3
レベル14

ベストアンサー率 21% (832/3844)

「特定の拡張子を持った一覧ファイルに記述されたファイル全てを特定拡張子に変換する」というのでしたら sedやawkを組み合わせれば可能です。 ファイル一覧として ---- list.txt ----- aaaaa.txt bbbbb.txt cccb.txt ---- list.txt ----- と書かれているとします。 バッチとスクリプトとして ---- reext.bat ...続きを読む
「特定の拡張子を持った一覧ファイルに記述されたファイル全てを特定拡張子に変換する」というのでしたら
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

お礼率 72% (75/103)

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

sed, awkのサンプルソースまで用意していただき、ありがとうございました。
投稿日時 - 2001-07-26 20:02:23
  • 回答No.5
レベル9

ベストアンサー率 46% (29/62)

delims で指定出来るのは文字列では無く単一の文字です。 tokens の解釈はそれであっています。 あとtokens の指定で tokens=1,2* とすると 分割したtokenの2番目以降を2つ目の変数に全部渡すことが出来ます。 (今回だと %Cに) また以下の方法でファイルリスト使う方法の替わりが出来ます /+ for /F %%a in (bak_lst.txt) d ...続きを読む
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

お礼率 72% (75/103)

複数の質問に回答していだだき、ありがとうございました。
お陰で、for文の理解度がアップしました。
投稿日時 - 2001-07-28 08:09:19
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
あなたが体験したトラブルや解決方法を共有しませんか?
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ