- ベストアンサー
バッチ処理でバックアップファイルの比較削除方法
- バックアップソフトにバッチ処理(WSH)を使って、特定のサーバのバックアップファイルをローカルに保存し、最新のファイル以外を削除する方法について教えてください。
- バックアップファイルを比較して削除するバッチ処理の具体的な手法について、名前の重複などの問題も考慮しながら詳しく教えてください。
- ARCServeを使用したバックアップファイルの比較削除方法に関する、参考情報や詳しい使い方について教えてください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
回答者は、Windows Script Host の世界でのファイル、フォルダの操作をどう表現するか説明し、補足内容から質問者に伝わったと考えます。回答者の回答はこれで区切りたいと思います。 以下は最後の補足へのコメントです。 objfolder 変数に代入されている Folder オブジェクトの files 属性には、該当フォルダに格納されている File に対応する File オブジェクトの集まり (Collection) が代入されています。(File オブジェクト1個ではありません) そのため、File Collection の要素を一つずつ取り出す手順が必要となってきます。VBScript では For Each 変数 In 集まり がその手順です。 For Each objFile In objfolder.files ' objFile に対する操作 Next この構文をとっかかりに少しずつ進めていけば目的のプログラムが得られるでしょう。もし分らないことがあれば、新規問い合わせを投函すれば、有識者の支援を得られるかもしれません。頑張ってください。 なお、これまでの参考文献としてあげた記事は分量があります。どうぞゆったりとした気分で味わいながら楽しんで頂ければ幸いです。 でわでわ (参考文献) 運用 Windows管理者のためのWindows Script Host入門 第11回(最終回) WSHスクリプトからのファイル操作(2) 1.フォルダの操作 http://www.atmarkit.co.jp/fwin2k/operation/wsh11/wsh11_01.html
その他の回答 (4)
- iriyak
- ベストアンサー率48% (40/82)
E:\aaa.txt, E:\bbb.txt の作成日付を比較してどちらが新しいかを判断する VBScript プログラムです。(表示上は半角スペースがなくインデントがなくなっています) 作成日付が新しいかどうかは、大小で判断できます。その結果に基づいて、GetFile した File オブジェクトに delete メソッド起動して、削除を指示します。 Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") Set aaa = objFSO.GetFile("E:\aaa.txt") ' aaa に File オブジェクトを代入 Set bbb = objFSO.GetFile("E:\bbb.txt") WScript.Echo "aaa.DateCreated : " & aaa.DateCreated WScript.Echo "bbb.DateCreated : " & bbb.DateCreated If aaa.DateCreated > bbb.DateCreated Then WScript.Echo "aaa.txt の作成日付が bbb.txt の作成日付よりも新しい" ' bbb に対して delete メソッド起動を指示 Else WScript.Echo "bbb.txt の作成日付が aaa.txt の作成日付よりも新しい" ' aaa に対して delete メソッド起動を指示 End If (参考文献) 基礎解説 チェック式 WSH入門 第17回 5.ファイル/フォルダ操作のメソッド http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh17/cformwsh17_05.html
- iriyak
- ベストアンサー率48% (40/82)
> Microsoft VBScript コンパイル エラー: 文字が正しくありません > っていうエラーが出てしまいました。 あれれ? と思って比較しました。理由は OKWave に投函するために半角スペース 2 個分を全角スペース( )に置き換えた。.WSF ファイルの場合、受け付けられないようですね。すみません。全角スペースを半角スペース 2 個に置き換えて再度実行をトライください。 その他の補足については別途投函します。
補足
今まで回答をしていただいてありがとうございます。 VBScriptとjavascriptを混ぜたソースですが、 19行目のfilepathの部分でファイルが見つかりませんって エラーがでてしまい、javascriptもみだしております。 FOR文でなんとかできるかもしれませんが、 まずはローカル環境のフォルダ内のファイルで試したいと思っております ありがとうございました
- iriyak
- ベストアンサー率48% (40/82)
E:\test 配下の複数ファイルのうち、ある条件を満足するファイルの削除を指示したい、ということですね。 Windows Script Host で、E:\test 配下のファイルを数え上げてそれぞれに対して操作を指示することができますので、基本的な枠組みはそれで問題ないと思います。E:\test フォルダ中のファイルを数え上げる方法については、インターネット上に沢山の例題があります。ひとつ紹介しておきます。 基礎解説 チェック式 WSH入門 ―― 演習方式で身につけるWSH超入門 ―― http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh01/cformwsh01_01.html 第1回~第17回まで一般公開されています。Scripting.FileSystemObject オブジェクトが関係しますが、質問者は WSH 初学者ということですので、仕事終わりにじっくり全解説に目を通した方がよいと思います。 さて、次に考えるのは、条件に満足するファイルをどう判定するか、です。『最新のバックアップファイル以外』をどう判定するか。これは質問者のプログラム課題として残しておきます。 別解として、何世代か格納できる格納領域を用意しておいて、その世代を超える古いファイルを順に削除するためのプログラムの要素を例示します。参考にしてください。 (スクリプトの内容と概説) list() は、targetpath のファイルの最終更新日付が、第二引数で指定する日時より古い場合、targetpath のファイルの削除を指示するコマンドを出力します。 第二引数の指定を簡便にするためにヘルパ関数を用意しました。次の3つの関数を利用できます。 MonthsAgo(n) : 実行日時から n か月前の日時 DaysAgo(n) : 実行日時から n 日前の日時 HoursAgo(n) : 実行日時から n 時間前の日時 これをあるフォルダに格納されている任意のファイルに対して繰り返せば、世代管理を実現できます。 (スクリプトの実行例) ★1 の部分を修正して実行ください。 E:\>cscript //nologo check.wsf DEL E:\EasySaverBackup\20070712105211091d0173\a.txt E:\> (スクリプト本体) <package> <job> <script language='VBScript'> Function MonthsAgo(n) MonthsAgo = FormatDateTime(DateAdd("m", - n, Now)) End Function Function DaysAgo(n) DaysAgo = FormatDateTime(DateAdd("d", - n, Now)) End Function Function HoursAgo(n) HoursAgo = FormatDateTime(DateAdd("h", - n, Now)) End Function </script> <script language='JavaScript'> function list(filepath, vbDate) { var FileSystemObject = new ActiveXObject('Scripting.FileSystemObject'); var file = FileSystemObject.getFile(filepath); if (file.DateLastModified < new Date(vbDate)) WScript.echo('DEL ' + file); } var targetpath = 'E:\\EasySaverBackup\\20070712105211091d0173\\a.txt'; // ★1 //list(targetpath, MonthsAgo(1)); //list(targetpath, HoursAgo(1)); list(targetpath, DaysAgo(7)); // 実行日時より 7 日超経過しているものを出力 </script> </job> </package> (参考情報: 類似問題) QNo.4017047『一定期間ごとにフォルダを自動削除したい。』 http://okwave.jp/qa4017047.html
補足
ご回答ありがとうございます。 かなり苦戦をしております。 上記のバッチを試しに動かしたのですが、 Microsoft VBScript コンパイル エラー: 文字が正しくありません っていうエラーが出てしまいました。 サーバ関係なく、まずは、ローカルの環境で、Dドライブに aaa.txtとbbb.txtをいれて、作成日を見て 古いほうを削除するようなバッチを作ってみたいのですが、 Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.GetFile("ファイル名") WScript.Echo "DateCreated : " & objFile.DateCreated 上記で、指定のファイル名の作成日をチェックできます。 それをうまく使って、比較してDeleteをやりたいのですが、 ちょっと困ってます。 簡単なサンプルいただけないでしょうか??
- iriyak
- ベストアンサー率48% (40/82)
こんにちは。 ARCServe で実際に1回バックアップを取得した時のディレクトリ構成を提示可能ですか?? どの部分を削除したいかをマーキングしてください。(このファイル、あるいは、このフォルダ配下全部、など) 回答者は、その内容をもとにプログラムの輪郭を提供可能かもしれません。 (ディレクトリ構成の出力例) cmd.exe の tree コマンドで以下のようなディレクトリ・ファイル一覧を出力可能です。以下は類似ソフトウェアのファイル出力例です。 E:\>tree EasySaverBackup フォルダ パスの一覧: ボリューム ボリューム ボリューム シリアル番号は 0075006B 4089:64DD です E:\EASYSAVERBACKUP ├─2007071210480309193a97 │ ├─20080422000540 │ ├─20080429000748 │ ├─20080506110544 │ └─20080513000344 ├─20070712105211091d0173 │ ├─20080416000319 │ ├─20080423000228 │ ├─20080430000800 │ └─20080507085010 ├─20070712105354091e963c │ ├─20080417001456 │ ├─20080424000837 │ ├─20080501002234 │ └─20080508000339 ├─20070712105419091ef4f6 │ ├─20080418000230 │ ├─20080425000132 │ ├─20080502000801 │ └─20080509000226 └─20070712105457091f8c83 ├─20080419000341 ├─20080426000234 ├─20080506111003 └─20080510000353 E:\>
補足
回答ありがとうございます。 >ARCServe で実際に1回バックアップを取得した時のディレクトリ >構成を提示可能ですか?? どの部分を削除したいかをマーキングして >ください。(このファイル、あるいは、このフォルダ配下全部、など) 上記に対してはツリーを載せます。 E:\ ├test 経緯を再度整理したのをのせます。 管理サーバから、リモートサーバのローカルにバックアップされている 上記Eドライブのtestというディレクトリに格納したファイルに対して、最新のバックアップファイル以外を削除させるバッチを作りたいです。 (例)aaa_1020.bak 更新日時 2007/10/20 aaa_1021.bak 更新日時 2007/10/21 上記ファイルを比較して、更新日時を見てaaa_1020.bakを削除 させるバッチを作成できたらって思っております。 ARCServeマネージャのグローバルオプションでバッチを指定することが できるのは分かっておりますが、バッチ(WSH)の技術がまだそこまで 達しておりません。 現在も基礎からやっております。
補足
細かいアドバイスありがとうございます。 上記のソースに「objFSO.DeleteFile」を使用して 比較して削除処理はできました。 次のステップとして、 下記ソースでまずファイルフォルダ内のファイル数を求めました。 Set objFS = WScript.CreateObject("Scripting.FileSystemObject") set objfolder = objFS.getfolder("E:\test") set objFile = objfolder.files Wscript.echo objfolder.Name & "情報" & vbcr & "ファイル数:" & objfile.count 今やりたいことの完成としては、 フォルダ内のファイル数を出して、*.txtというように検索をかけて *.txtファイルの中から一番作成日付が新しいもの以外は 削除するっていうようなプログラムがシンプルではないかって 思っております。 バックアップファイルっていうのは、拡張子は一緒でありますし、 ファイル名を明示的に書くと間違ってたらエラーで終了して しまいますので、上記のことができたら幸いです。 簡単にはできないと思っておりますので、 色々探してみます。 何かアドバイスできることがあるようでしたら、 教えてください。