Daisuke's TechBlog

日々の仕事で得た技術的なことを書いてきます

Windows環境バックアップスクリプト

自宅で使ってるバックアップスクリプトを晒します。というか、自宅環境のバックアップを1年以上取ってなかったみたい。危ねえ、、


ポイントは2点。

  • バックアップ対象をショートカットで指定できるようにしたところ。
    • スクリプトと同じフォルダにtargetという名前のフォルダを作成し、その中にショートカットを入れることでバックアップ対象とすることができる。
  • バックアップを日付フォルダに保存するようにしたところ
    • 同日内の重複実行を防ぎます。
    • 以前いつバックアップしたか分かります。
'=== コピー時のオプション ============================
Const FOF_SILENT            = &H04      '進捗ダイアログを表示しない。
Const FOF_RENAMEONCOLLISION = &H08      'ファイルやフォルダ名が重複するときは「コピー ~ 」のようなファイル名にリネームする。
Const FOF_NOCONFIRMATION    = &H10      '上書き確認ダイアログを表示しない([すべて上書き]と同じ)。
Const FOF_ALLOWUNDO         = &H40      '操作の取り消し([編集]-[元に戻す]や{ctrl}+{z})を有効にする。
Const FOF_FILESONLY         = &H80      'ワイルドカードが指定された場合のみ実行する。
Const FOF_SIMPLEPROGRESS    = &H100     '進捗ダイアログは表示するがファイル名は表示しない。
Const FOF_NOCONFIRMMKDIR    = &H200     'フォルダ作成確認ダイアログを表示しない(自動で作成)。
Const FOF_NOERRORUI         = &H400     'コピーや移動ができなかった場合の実行時エラーを発生させない。ただし、対象のファイルを飛ばして処理を続けるわけではないことに注意。
Const FOF_NORECURSION       = &H1000    'サブフォルダ内のファイルはコピーしない(ただし、フォルダは作成される)。

'=== コピー用オブジェクトの生成 ======================
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Set backupFiles = CreateObject("Scripting.Dictionary")
Set sh = WScript.CreateObject("WScript.Shell")
Set shApp = WScript.CreateObject("Shell.Application")

'=== バックアップホーム ==============================
backupHome="\\LS-CHL18E\nas\backup\"

'=== バックアップ先の作成 =============================
today       = Date()
yearString  = YEAR(today)
monthString = Right(0 & Month(today),2)
dayString   = Right(0 & Day(today),2)

backupSaveDirName = yearString & "." & monthString & "." & dayString & "\"
backupSaveDir = backupHome & backupSaveDirName

If fso.FolderExists(backupSaveDir) = True Then
  WScript.Echo "本日は既にバックアップ済です。"
  WScript.Quit
Else
  fso.CreateFolder(backupSaveDir)
End If

'=== バックアップ対象の取得 ==========================
backupTargetDir="target"
Set backupTarget = fso.GetFolder(backupHome & backupTargetDir)

For Each file In backupTarget.Files
  Set link = sh.CreateShortCut(file)
  keyName = Replace( file.Name, ".lnk", "" )
  backupFiles.Add keyName, link.TargetPath
Next

'=== バックアップ(コピー)実行 ==========================
For Each target In backupFiles.Keys
  targetBackup = backupFiles(target)
  targetSaveDir = backupSaveDir
  
  Set targetSave = shApp.NameSpace(targetSaveDir)
  targetSave.CopyHere targetBackup, FOF_NOCONFIRMATION + FOF_NOERRORUI
Next

MsgBox "バックアップが完了しました。", _
       vbOKOnly, _
       "バックアップスクリプト"