DOSバッチファイルでファイル名変更



 ◇-?DOSバッチファイルでファイル名変更-DOSわからん-08/02-09:37(245)-No.481298
   ┗?!Re:DOSバッチファイルでファイル...-pandora-08/02-11:06(243)-No.481306
     ┗?!?Re:DOSバッチファイルでファイ...-DOSわからん-08/02-21:59(232)-No.481347
       ┗?!?!Re:DOSバッチファイルでファイ...-pandora-08/02-22:36(232)-No.481356
         ┗?!?!?Re:DOSバッチファイルでファ...-DOSわからん-08/04-08:48(198)-No.481434
           ┗?!?!?!Re:DOSバッチファイルでファ...-pandora-08/04-10:39(196)-No.481438
             ┗?!?!?!?Re:DOSバッチファイルでフ...-DOSわからん-08/07-09:59(124)-No.481582
               ┗?!?!?!?!Re:DOSバッチファイルでフ...-pandora-08/07-12:20(122)-No.481587

▲このページのトップに戻る
481298DOSバッチファイルでファイル名変更DOSわからん 2009/08/02-09:37

メーカー名:SONY ソニー
OS名:WindowsXp Professional
パソコン名:PCV-HS51BC5
トラブル現象: DOSバッチファイルの書き方がわからない
--
DOSのバッチファイルで連続したファイルをファイルの更新日付をつけた名に変更したいのですが。
たとえばaa**.*.txtというファイルの更新日が2009/07/30 09:11だとして、それを取得し、

ファイル名をaa**_20090730.txtに変更したいです。*でわかるようにファイルは多々あります。
chg.batというバッチを実際作ってみましたがうまくいきません。
chg.batの内容は以下のとおりです。
------------------------------
echo off
for %%A in (aa**.*.txt) do set fname=%%^tA
set fname=%%fname:/=%%
set fname=%%fname:^0,8%%
ren %%A aa**_%%fname%%.txt
------------------------------
正しいバッチはどのような内容でしようか?どなたかわかる方おしてください。

▲このページのトップに戻る
481306Re:DOSバッチファイルでファイル名変更pandora 2009/08/02-11:06

記事番号481298へのコメント
DOSわからんさんは No.481298「DOSバッチファイルでファイル名変更」で書きました。

作成されたものには、以下のようなBUGがあります

BUGの内容
 1.FOR-DO文内で複数の処理をさせる場合、()でくくって副文(入れ子文)にする
 2.FOR-DO文内での変数利用は、遅延環境変数への展開をかけないとうまく変数利用できない
 3.FOR-DO文内での変数参照方法の拡張は、「^」 ではなく「~」を使用
  %%^tA → %%~tA
 4.ファイル名確定に「*」は使用できない
  aa**_%%fname%%.txt ではNG
  このような場合、特定の文字を使ってSPLITをかけ、欲しい文字列を取得してマージする

以下の形式で出来るはずですよ
(とりあえず、動作は確認済み)

-----------------------
@ECHO OFF
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION

FOR %%A IN (aa*.txt) DO (
  SET FNAME=%%A
  SET FTIME=%%~tA
  SET FTIME=!FTIME:/=!
  SET FTIME=!FTIME:~0,8!
  FOR /F "USEBACKQ TOKENS=1* DELIMS=." %%I IN (`ECHO !FNAME!`) DO (SET FBASE=%%I)

  SET RENNAME=!FBASE!_!FTIME!!FNAME:~-4!
  echo %%A → !RENNAME!
rem REN %%A !RENNAME!
)
pause

ENDLOCAL
EXIT
-----------------------

コマンドファイルは、拡張子を「.cmd」にしてください (例: fileren.cmd)
全角スペースで入れ子にしてるので、半角スペースに置換してください
あと、rename処理は、コメント化してあります


P.S.
 惜しかったですね・・・もうちょっとでした (笑

▲このページのトップに戻る
481347Re:DOSバッチファイルでファイル名変更DOSわからん 2009/08/02-21:59

記事番号481306へのコメント
pandoraさんは No.481306「Re:DOSバッチファイルでファイル名変更」で書きました。

pandoraさん、ありがとうございます。もう少しおしえてください。
下記の部分で何をしてるのか、色々調べたけどわかりません。
おしえていただけないでしょうか?

>SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION


>  SET FNAME=%%A
>  SET FTIME=%%~tA
>  SET FTIME=!FTIME:/=!
>  SET FTIME=!FTIME:~0,8!
>  FOR /F "USEBACKQ TOKENS=1* DELIMS=." %%I IN (`ECHO !FNAME!`) DO (SET FBASE=%%I)
>
>  SET RENNAME=!FBASE!_!FTIME!!FNAME:~-4!
>  echo %%A → !RENNAME!
>rem REN %%A !RENNAME!
>)
>pause
>
>ENDLOCAL
>EXIT



あと、動作させるためにはすべての全角スペースを半角に置換して
やればいいのでしょうか?
また、rename処理のコメント化を解除して、ちゃんと動かすためにはどうすれば?


たびたびすいません、よろしくお願いします。

▲このページのトップに戻る
481356Re:DOSバッチファイルでファイル名変更pandora 2009/08/02-22:36

記事番号481347へのコメント
DOSわからんさんは No.481347「Re:DOSバッチファイルでファイル名変更」で書きました。

DOSコマンドに関する詳細全般は、以下を参考に
http://www.fpcu.jp/dosvcmd/index.htm

その他については、

>SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
>ENDLOCAL
http://pckida.web.fc2.com/com/SETLOCAL.html

>SET
http://www.fpcu.jp/dosvcmd/set.htm

>FOR
http://www.fpcu.jp/dosvcmd/batch.htm

>REM
http://www.fpcu.jp/dosvcmd/batch.htm#rem


特に難しい構文

>FOR /F "USEBACKQ TOKENS=1* DELIMS=." %%I IN (`ECHO !FNAME!`) DO (SET FBASE=%%I)
変数 FNAME から、「.」を区切り文字にして、単語を切り分け
切り分けした一つ目を変数 %%I に格納、それ以降を %%J に格納

#この構文は、まだまだアレンジが出来ます
#どんなアレンジが出来るかは自分で調べましょう


>あと、動作させるためにはすべての全角スペースを半角に置換して
>やればいいのでしょうか?

全角スペース1文字を、半角スペース1文字に、全て置換してください


>また、rename処理のコメント化を解除して、ちゃんと動かすためにはどうすれば?

こんな具合に、頭の rem の文字を削除してください
  rem REN %%A !RENNAME! → REN %%A !RENNAME!



P.S.
 プログラミングを覚えたいなら、人に聞いてばかりじゃぁダメですよ
 自分で苦労して調べて、初めてコヤシになる・・・ということを自覚しておいてくださいね
 聞いた事って・・・大抵・・・すぐ忘れるでしょ?

 例えば「SETLOCAL」でググると、上記に書いてるようなサイトにたどり着けるもんです
 まずは、徹底的にコマンドと文法を覚えましょう
#英語は、単語と文法を知らなきゃ何も出来ないのと同じです

 人の作ったものが、何がどうなってるか、どうしてるのかって調べていくのが
 いちばん近道かもね
 頑張って勉強してください

▲このページのトップに戻る
481434Re:DOSバッチファイルでファイル名変更DOSわからん 2009/08/04-08:48

記事番号481356へのコメント
pandoraさんは No.481356「Re:DOSバッチファイルでファイル名変更」で書きました。


pandoraさんありがとうございます。
ただ、下記の部分がいまだによくわかりません。

FOR /F "USEBACKQ TOKENS=1* DELIMS=." %%I IN (`ECHO !FNAME!`) DO (SET FBASE=%%I)

  SET RENNAME=!FBASE!_!FTIME!!FNAME:~-4!
  echo %%A → !RENNAME!

もちろんおしえてくれたサイトにはいきました。他でも多々調べました。
最初の不完全なバッチにいたるまでも人には聞かず、散々調べてできましたが、
いまいち調べ方がなってないのかもしれません。

すいません、上記構文の意味(特に"USEBACKQ TOKENS=1* DELIMS=." や!FNAME:~-4!、
%%A → !RENNAME!の→の意味)を細かくおしえていただけないでしょうか?

▲このページのトップに戻る
481438Re:DOSバッチファイルでファイル名変更pandora 2009/08/04-10:39

記事番号481434へのコメント
DOSわからんさんは No.481434「Re:DOSバッチファイルでファイル名変更」で書きました。

以下を参照ください


・tokensとdelimsの意味を教えてください
http://www.fpcu.jp/dosvcmd/bbs/log/cat3/for_in_do/for_f/4-1513.html

・MS-DOSでコマンドの実行結果を変数に入れる
http://www.odin.hyork.net/write/writeg008-001.html

・文字列の連結
http://code.nanigac.com/forum/view/250

・遅延環境変数の展開
http://f32.aaa.livedoor.jp/~kobun/index.php?CMD.EXE%A4%CE%C3%D9%B1%E4%B4%C4%B6%AD%CA%D1%BF%F4%A4%CE%C5%B8%B3%AB

・環境変数内容を参照する際の拡張機能: %環境変数:~[-]開始オフセット[,[-]長さ]%
http://www.fpcu.jp/dosvcmd/set.htm

▲このページのトップに戻る
481582Re:DOSバッチファイルでファイル名変更DOSわからん 2009/08/07-09:59

記事番号481438へのコメント
pandoraさんは No.481438「Re:DOSバッチファイルでファイル名変更」で書きました。

ありがとうございます。だいぶわかりましたが、まだ以下の部分がわかりません。
すいませんが、参考サイトではなく説明していただけませんか?

"USEBACKQ TOKENS=1* DELIMS=." %%I IN (`ECHO !FNAME!`)


USEBACKQやTOKENS=1*の*、(`ECHO !FNAME!`)の`が意味不明です。





▲このページのトップに戻る
481587Re:DOSバッチファイルでファイル名変更pandora 2009/08/07-12:20

記事番号481582へのコメント
DOSわからんさんは No.481582「Re:DOSバッチファイルでファイル名変更」で書きました。

>USEBACKQやTOKENS=1*の*
WindowsXPの「ヘルプとサポート」から「FOR」のHELPを調べると記述があります

Windowsが標準で持ってる、オンラインヘルプも活用しましょう

>(`ECHO !FNAME!`)の`
前述の「MS-DOSでコマンドの実行結果を変数に入れる」をもう一度よく読み返しましょう
#漠然と参照サイトを紹介してるわけじゃないですよ


(追記)
ECHOが何をする構文なのかと、このFOR文が何をするためのものかを合わせ
処理的に何をしてるのかが想像してください
#このFOR文の目的は、最初に説明済み

A1.本ページは参考になりましたか? 又はアドバイスがありますか?
解決 参考になった 参考にならなかった アドバイスする

A2.何度目の訪問ですか?
初めて来た   数度目(2〜4) 5回以上来ている   管理人:

A3.何か一言どうぞ(アドレスは書くことができません)

A4.アドレスがあればどうぞ(1つまで)


↑↑↑↑よろしければ押してください↑↑↑↑

何か一言(本ページで参考になったならないを含めて残してあります)
◎:解決 ○:参考になった ×:参考にならなかった !:アドバイスあり

参考回数投稿日時何か一言
初めて2011/05/13/(金) 09:59:08pandoraさんみたいな人大好きです。有益な情報とコード提供ありがとうございます。私も参考にして下記のようなファイル名を変更するBatファイルを作ったので、参考になるかと思い貼り付けます。変更元:アルファベット色々_Setup1_十文字固定アルファベット_LotReport.XLS変更後:十文字固定アルファベット.xls区切り文字はアンダースコア "_" です。区切りはDELIMS=で指定しています。また、複数の区切り文字がある場合、TOKENS=で何番目を取り出すかを指定しています。以下実際のコード。作ったcmdファイルはSendtoに入れて便利に使っています。@ECHO OFFSETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSIONFOR %%A IN (*_Setup1_*_LotReport.XLS) DO (  SET FNAME=%%A  FOR /F "USEBACKQ TOKENS=3* DELIMS=_" %%I IN (`ECHO !FNAME!`) DO (SET FBASE=%%I)  SET RENNAME=!FBASE!.xls  echo %%A → !RENNAME! REN %%A !RENNAME!)copy Q*.xls \\社内サーバーの決められた場所pauseENDLOCALEXIT Mozilla/WinXP
初めて2012/08/09/(木) 21:18:57 MSIE8/WinXP