プロが教えるわが家の防犯対策術!

今、バックアップソフトにバッチ処理(WSH)を走らせたいのですが、
要件として、とあるサーバのバックアップファイルをローカルの
ディレクトリに保存して、最新のバックアップファイル以外を削除させるバッチを作りたいです。

(例)
ディレクトリ名:test
バックアップファイル:最新と1個前
バックアップソフト:ARCServe

上記の場合、1個前のファイルを日付を見て比較して削除をさせるようなイメージです。
名前は同名をつけられないので、そこらへんもうまくできたらって
思っております。

参考になるURLが見つからなく、基本的な使い方しかなかったので、
詳しい方いましたら、情報をください。

A 回答 (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 …
    • good
    • 0

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/cformwsh1 …

この回答への補足

細かいアドバイスありがとうございます。
上記のソースに「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ファイルの中から一番作成日付が新しいもの以外は
削除するっていうようなプログラムがシンプルではないかって
思っております。

バックアップファイルっていうのは、拡張子は一緒でありますし、
ファイル名を明示的に書くと間違ってたらエラーで終了して
しまいますので、上記のことができたら幸いです。

簡単にはできないと思っておりますので、
色々探してみます。

何かアドバイスできることがあるようでしたら、
教えてください。

補足日時:2008/05/25 21:57
    • good
    • 0

> Microsoft VBScript コンパイル エラー: 文字が正しくありません


> っていうエラーが出てしまいました。

あれれ? と思って比較しました。理由は OKWave に投函するために半角スペース 2 個分を全角スペース( )に置き換えた。.WSF ファイルの場合、受け付けられないようですね。すみません。全角スペースを半角スペース 2 個に置き換えて再度実行をトライください。

その他の補足については別途投函します。

この回答への補足

今まで回答をしていただいてありがとうございます。
VBScriptとjavascriptを混ぜたソースですが、
19行目のfilepathの部分でファイルが見つかりませんって
エラーがでてしまい、javascriptもみだしております。

FOR文でなんとかできるかもしれませんが、
まずはローカル環境のフォルダ内のファイルで試したいと思っております
ありがとうございました

補足日時:2008/05/25 23:30
    • good
    • 0

E:\test 配下の複数ファイルのうち、ある条件を満足するファイルの削除を指示したい、ということですね。



Windows Script Host で、E:\test 配下のファイルを数え上げてそれぞれに対して操作を指示することができますので、基本的な枠組みはそれで問題ないと思います。E:\test フォルダ中のファイルを数え上げる方法については、インターネット上に沢山の例題があります。ひとつ紹介しておきます。

基礎解説
チェック式 WSH入門
―― 演習方式で身につけるWSH超入門 ――
http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh0 …

第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をやりたいのですが、
ちょっと困ってます。

簡単なサンプルいただけないでしょうか??

補足日時:2008/05/25 19:29
    • good
    • 0

こんにちは。



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)の技術がまだそこまで
達しておりません。
現在も基礎からやっております。

補足日時:2008/05/25 15:27
    • good
    • 0

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