アプリ版:「スタンプのみでお礼する」機能のリリースについて

環境: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 --------------

と言うように、出来るでしょうか?

厚かましい質問ですが、よろしくお願いいたします。

A 回答 (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


#但し上記方法では、対象ファイルが同一フォルダ内かフォルダ名に「.」が
#複数入っていないことが条件です。
    • good
    • 0
この回答へのお礼

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

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

と解釈しましたが、間違っていませんか?

お礼日時:2001/07/27 19:46

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バッチと対象のファイルが同一のフォルダにあるものとしています。
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/07/28 08:09

「特定の拡張子を持った一覧ファイルに記述されたファイル全てを特定拡張子に変換する」というのでしたら


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
とリネームされるはずです。
    • good
    • 0
この回答へのお礼

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

sed, awkのサンプルソースまで用意していただき、ありがとうございました。

お礼日時:2001/07/26 20:02

 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/scripti …
    • good
    • 0
この回答へのお礼

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

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

WSHのサンプルソースまで用意していただき、ありがとうございました。
WSHも勉強してみます。

お礼日時:2001/07/26 19:58

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



参考URL:http://www1.plala.or.jp/tsune/2msdos.html#c_for
    • good
    • 0
この回答へのお礼

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

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

お礼日時:2001/07/26 19:54

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!