|
660) バックアップファイル名にYYYYMMDD_hhmmssをつける トーマス 2003/10/07(火) 15:30 |
|
バックアップを取ろうとしていて、世代管理をしたいので、 YYYY(西暦) MM(月) DD(日) hh(時間) mm(分) ss(秒) をつけたいのですが、バッチだけで出来ればなーと思っています。 宜しくお願いします。 |
|
662) Re:バックアップファイル名にYYYYMMDD_hhmmssをつける じゃく 2003/10/08(水) 07:56 |
|
>バックアップを取ろうとしていて、世代管理をしたいので、 >YYYY(西暦) >MM(月) >DD(日) >hh(時間) >mm(分) >ss(秒) >をつけたいのですが、バッチだけで出来ればなーと思っています。 >宜しくお願いします。 OSは何ですか? 2000/XPなら set DT=%date:/=% set TM=%time::=% set fname=%DT%_%TM% echo %fname% echo ---- sample ---- > %fname% ただし、echo %date% の結果に曜日が入る場合、 水 2003/10/08 この場合は、最初の行の set DT=%date:/=% の後に set DT=%date:~2,8% を挿入すると曜日が削除できると思います。 |
|
842) Re2:バックアップファイル名にYYYYMMDD_hhmmssをつける ももんが 2003/11/10(月) 20:46 |
|
はじめまして、ももんがと申します。 OSはWindows 2000を使用しています。 最近、Dosコマンドを使用するようになり、ヘルプなどを参考にバッチを作成しているのですが、以下のようなことをさせるバッチを作成するができておりません。どなたかご存知の方がいれば教えていただけないでしょうか。 D:\test配下に200XXXXX~20031110という日付フォルダがあり、この日付フォルダの下にフォルダ名と同じファイル名.zipというファイルがあります。このフォルダ、ファイルは毎日増えていき、一番古いフォルダとファイルはその際削除されます。 作りたいバッチというのが、すべてのフォルダに入っている日付ファイル名.zipのファイルスタンプをファイル名と同じ日付で時間を2時に設定できるものを作りたいと思っています。 宜しくお願いします。 |
|
849) Re3:バックアップファイル名にYYYYMMDD_hhmmssをつける ふぇむ 2003/11/12(水) 14:56 |
|
>はじめまして、ももんがと申します。 >D:\test配下に200XXXXX~20031110という日付フォルダがあり、この日付フォルダの下にフォルダ名と同じファイル名.zipというファイルがあります。このフォルダ、ファイルは毎日増えていき、一番古いフォルダとファイルはその際削除されます。 >作りたいバッチというのが、すべてのフォルダに入っている日付ファイル名.zipのファイルスタンプをファイル名と同じ日付で時間を2時に設定できるものを作りたいと思っています。 ファイルスタンプとはファイルの最終更新日ですか? DOSコマンドだけではそれは変更できなさそうですね。 WSHでFileSystemObject系でなんかできるかな?と思ったけど、最終更新日のプロパティは参照ONLYと書いてあるので更新できなさそう。 Rubyのリファレンスによると、FileクラスのFile::utimeメソッドで最終更新日時が変更できそうですね(しかしWindows2000上のRubyでこれが使えるかどうかは知りません)。 その他なんかしらフリーウェアかシェアウエアなどでそのようなことができるものがあるかもしれません。 そこさえクリアできればあとは(何で書いても)比較的簡単だと思います。 とりあえずこれだけ。 |
|
856) Re4:バックアップファイル名にYYYYMMDD_hhmmssをつける Hellcat 2003/11/12(水) 23:12 |
|
ふぇむさん、こん**は。 >その他なんかしらフリーウェアかシェアウエアなどでそのようなことができるものがあるかもしれません。 >そこさえクリアできればあとは(何で書いても)比較的簡単だと思います。 Unix like toolのtouchコマンドで可能と思われます。 http://www.piedey.co.jp/softs/ntuxtl.html 最終更新日の書き換えは touch -m mmddhhmmyy filename -a: ファイルの最終アクセス日付を変更。 -m: ファイルの最終更新時刻を変更。 -C: ファイルの作成時刻を変更。 例えば2003年11月30日2時45分としたい場合は touch -m 1130024503 filename となります。 今回のお尋ねはファイルネームから日付を取りだして、それをタイムスタンプ(時刻は一律に2時00分)にしたいとのことですので、 touch -m %mmdd%0200%yy% %filename% のように環境変数にファイルネームの文字列から代入することになるでしょうね。 したがって、ファイルネームの文字列から 環境変数mmddに月日の部分 yyに年の部分 filenameに該当ファイルのフルパス がセットできればOKだと思います。 ももんがさんのファイルは D:\test\20031101\20031101.zip D:\test\20031102\20031102.zip D:\test\20031103\20031103.zip … … このような構成らしいのですが、FOR文でこれらのファイルは D:\test\2003*\*.zip というようなディレクトリー部分にワイルドカードを含む形式で展開できるのでしょうか? Win2000が手許にないので確認のしようがないのですが。 |
|
864) Re5:バックアップファイル名にYYYYMMDD_hhmmssをつける ももんが 2003/11/14(金) 14:12 |
|
ふぇむさん、Hellcatさん、コメントしていただき、ありがとうございます。 >ファイルスタンプとはファイルの最終更新日ですか? ファイルスタンプの変更はバッチを起動すると以下のように変更されるようにしたいと思っています。 D:\test\20031101\20031101.zip(2003/11/05 13:00)の場合、ファイルスタンプは2003/11/01 2:00へ変更 D:\test\20031102\20031102.zip(2003/11/06 15:00)の場合、ファイルスタンプは2003/11/02 2:00へ変更 ・・・ ・・・ ・・・ >このような構成らしいのですが、FOR文でこれらのファイルは > D:\test\2003*\*.zip >というようなディレクトリー部分にワイルドカードを含む形式で展開できるのでしょうか? すいません、初心者なのでよくfor文の使い方を理解していないのですが、ワイルドカードを含む形式では難しいと思います。 あと、このバッチなんですが、2003年以降も使用したいと思っています。 現在、ファイルスタンプを変更したいファイルのフルパスは取得する事ができたのですが、その情報を基にファイルスタンプを変更すればいいのかで止まってしまっています。 ご存知の方がいましたら、コメントを宜しくお願いします。 echo off set ddir=d:\test for /f "tokens=1" %%a in ('dir /B /O:- %ddir%') do ( echo %ddir%\%%a\%%a.zip ) |
|
865) Re6:バックアップファイル名にYYYYMMDD_hhmmssをつける ふぇむ 2003/11/14(金) 15:12 |
|
>>ファイルスタンプとはファイルの最終更新日ですか? > >ファイルスタンプの変更はバッチを起動すると以下のように変更されるようにしたいと思っています。 「ファイルスタンプ」という言い方は特殊だと思うんですが.... >現在、ファイルスタンプを変更したいファイルのフルパスは取得する事ができたのですが、その情報を基にファイルスタンプを変更すればいいのかで止まってしまっています。 > >echo off > >set ddir=d:\test > >for /f "tokens=1" %%a in ('dir /B /O:- %ddir%') do ( > echo %ddir%\%%a\%%a.zip >) うーん、この for 文はさまざまな問題を内包していますね。 フルパスのリストを得るだけなら、 dir /b /s "ターゲットのパターン" だけで十分で、for は不要ですね。 この for 文では tokens=1 になっているしセパレータの指定もないので、もしも空白を含むフォルダ名が上位にあったりするとそこで切れてしまいます。 Winodwsのフォルダ名・ファイル名は空白を許容していますが、通常空白は分離文字なので、ファイル名を表す変数を使用するときは常に "" で囲うことを心掛けた方が安全です。 同様にサブルーチン等に値を引き渡す時も "" で囲って拾うほうで %~1 などで除去する、ことが必要です。 以下参考にしてみて下さい。対象となるファイルが全て d:\test 以下にあり、*.zip というパターンであるとして定数を与えています。 :MAIN_LOOP ブロックでは、対象ファイルのフルパスとベース名と今のタイムスタンプ情報が得られるので、ここで好きなように加工すればいいでしょう。 @echo off setlocal set SOURCE_FOLDER=d\test set TARGET_PATTERN_BASE=*.zip set WORK_FOLDER=%TEMP% set TARGETLIST_BASE=__tagrget_list.txt if NOT "%SOURCE_FOLDER:~-1%" == "\" ( set SOURCE_FOLDER=%SOURCE_FOLDER%\ ) if NOT "%WORK_FOLDER:~-1%" == "\" ( set WORK_FOLDER=%WORK_FOLDER%\ ) set TARGET_PATTERN=%SOURCE_FOLDER%%TARGET_PATTERN_BASE% set TARGET_LIST=%WORK_FOLDER%%TARGETLIST_BASE% dir /b /s "%TARGET_PATTERN%" > "%TARGET_LIST%" for /F "usebackq tokens=*" %%a in ( "%TARGET_LIST%" ) do ( call :MAIN_LOOP "%%a" "%%~na" "%%~ta" ) goto :end :MAIN_LOOP set __FULLPATH=%~1 set __BASENAME=%~2 set __TSTAMP=%~3 echo ターゲット[%__FULLPATH%] / ベース名[%__BASENAME%] / タイムスタンプ[%__TSTAMP%] goto :eof :end endlocal |
|
866) Re6:バックアップファイル名にYYYYMMDD_hhmmssをつける ふぇむ 2003/11/14(金) 15:23 |
|
補足です。このような処理は、(さっきのサンプルスクリプトもそう書いていますが) ●まず対象をリストアップしたファイルを作ることを考える。 ●そのファイルに対して全件をループする。ループでは必要な情報分解を for 文にやらせる。 ●心臓部の1件を対象とした処理は外のサブルーチンにて書いて、分解された情報を引数として渡す。 といったように役割を分離した方が見通しがいいです。 タイムスタンプの更新は、ファイル名の情報とタイムスタンプ情報が不一致かどうかを判定して不一致のものだけ更新するように書いた方がいいと思います。 >あと、このバッチなんですが、2003年以降も使用したいと思っています。 それはリストアップの条件の一部なんだと思いますが、外部から与えるなり環境から取得・加工するなり、設計次第でどうにでもなるのでは。 |
|
867) Re6:バックアップファイル名にYYYYMMDD_hhmmssをつける じゃく 2003/11/14(金) 16:11 |
|
>ファイルスタンプの変更はバッチを起動すると以下のように変更されるようにしたいと思っています。 > >D:\test\20031101\20031101.zip(2003/11/05 13:00)の場合、ファイルスタンプは2003/11/01 2:00へ変更 >D:\test\20031102\20031102.zip(2003/11/06 15:00)の場合、ファイルスタンプは2003/11/02 2:00へ変更 > ・・・ > ・・・ > ・・・ > >ご存知の方がいましたら、コメントを宜しくお願いします。 今回は、フォルダ名=ファイル名なので簡単にこんな感じでどうでしょう? echo off set ddir=d:\test push %ddir% for /D %%d in (*) do call :sub %%d goto end :sub set yyyymmdd=%1 set mmdd=%yyyymmdd:~4,4% set yy=%yyyymmdd:~2,2% touch -m %mmdd%0200%yy% %ddir%\%yyyymmdd%\%yyyymmdd%.zip goto :EOF :end |
|
910) Re7:バックアップファイル名にYYYYMMDD_hhmmssをつける ももんが 2003/11/27(木) 16:59 |
|
みなさま、ご教授ありがとうございました。 昨日希望通りのバッチを作成することが出来ました。 |