Je partage avec vous un script de backup très simple que j'ai réalisé en VBS.
Pourquoi le VBS ?
Parce qu'après avoir fait le premier script de backup en perl, je me suis demandé pourquoi pas en VBS après tout... c'est quand même le language par excellence de windows qui permet l'accès WMI très simple etc...
Après quelques benchs... que constate-je ? o_O horreur ! (ou bonheur ?)... le même script en Perl est 50% plus rapide... Si le VBS s'exécute plus lentement que le Perl... à part la souplesse d'accès aux fonctions systèmes, pour le reste je ne vois plus d'intérêt au VBS...
Le script fait un backup / image : il copie dans le dossier de destination le dossier source en supprimant dans le dossier de destination les fichiers ayant disparu du dossier source
Usage
Usage: cscript.exe backup_copy.vbs <Source> <Dest> [Delete] [Log]
- Source : source folder
- Dest : destination folder
- Delete : whether to delete backup old files (default TRUE)
- Log : log file (default : no log)
Code source
Option Explicit
On Error Resume Next
Dim oFS, Erreur, FicLog, SRC, DST, DELETE_FOLDERS, LOG_FILE
Set oFS = WScript.CreateObject("Scripting.FileSystemObject")
Erreur = ""
DELETE_FOLDERS = True
LOG_FILE = ""
If WScript.Arguments.Count < 2 Then
Erreur = "Not enough arguments"
End If
If WScript.Arguments.Count > 4 Then
Erreur = "Too much arguments"
End If
If WScript.Arguments.Count >= 2 Then
SRC = WScript.Arguments(0)
DST = WScript.Arguments(1)
End If
If WScript.Arguments.Count >= 3 Then
If LCase(WScript.Arguments(2)) = "0" Then DELETE_FOLDERS = False
If LCase(WScript.Arguments(2)) = "no" Then DELETE_FOLDERS = False
If LCase(WScript.Arguments(2)) = "non" Then DELETE_FOLDERS = False
If LCase(WScript.Arguments(2)) = "false" Then DELETE_FOLDERS = False
End If
If WScript.Arguments.Count >= 4 Then
LOG_FILE = WScript.Arguments(3)
End If
If Erreur <> "" Then
WScript.Echo "Error: " & Erreur & vbCrLf & vbCrLf & _
"Usage: cscript.exe backup_copy.vbs <Source> <Dest> [Delete] [Log]" & vbCrLf & _
" - Source : source folder" & vbCrLf & _
" - Dest : destination folder" & vbCrLf & _
" - Delete : whether to delete backup old files (default TRUE)" & vbCrLf & _
" - Log : log file (default : no log)" & vbCrLf
Else
If LOG_FILE <> "" Then Set FicLog = oFS.OpenTextFile(LOG_FILE, 2, True)
Backup SRC, DST
If LOG_FILE <> "" Then FicLog.Close
End If
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub Backup(Fsrc, Fdst)
Dim oFile, oFile2, oFolder
On Error Resume Next
If oFS.FolderExists(Fsrc) Then
' create folder
If Not(oFS.FolderExists(Fdst)) Then
oFS.CreateFolder Fdst
LogWrite "Create Folder " & Fdst
End If
' copy
For Each oFile In oFS.GetFolder(Fsrc).Files
If oFS.FileExists(AddSlash(Fdst) & oFile.Name) Then
Set oFile2 = oFS.GetFile(AddSlash(Fdst) & oFile.Name)
If oFile.Size <> oFile2.Size OR oFile.DateLastModified > oFile2.DateLastModified Then
LogWrite "Copy File " & AddSlash(Fdst) & oFile.Name
oFile.Copy AddSlash(Fdst) & oFile.Name, True
End If
Else
LogWrite "Copy File " & AddSlash(Fdst) & oFile.Name
oFile.Copy AddSlash(Fdst) & oFile.Name, True
End If
Next
For Each oFolder In oFS.GetFolder(Fsrc).SubFolders
Backup AddSlash(Fsrc) & oFolder.Name, AddSlash(Fdst) & oFolder.Name
Next
' delete
If DELETE_FOLDERS Then
For Each oFile In oFS.GetFolder(Fdst).Files
If Not(oFS.FileExists(AddSlash(Fsrc) & oFile.Name)) Then
LogWrite "Delete File " & oFile.Path
oFS.DeleteFile oFile.Path
End If
Next
For Each oFolder In oFS.GetFolder(Fdst).SubFolders
If Not(oFS.FolderExists(AddSlash(Fsrc) & oFolder.Name)) Then
LogWrite "Delete Folder " & oFolder.Path
CleanFolder oFolder.Path
oFolder.Delete True
End If
Next
End If
End If
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub CleanFolder(sFolder)
Dim oFile, oFolder
On Error Resume Next
For Each oFile In oFS.GetFolder(sFolder).Files
oFile.Delete True
Next
For Each oFolder In oFS.GetFolder(sFolder).SubFolders
CleanFolder oFolder.Path
oFolder.Delete True
Next
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub LogWrite(line)
On Error Resume Next
If LOG_FILE <> "" Then FicLog.WriteLine GetDateNow() & " " & line
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function GetDateNow()
Dim y, m, d, h, i, s
y = DatePart("yyyy", Now)
m = DatePart("m", Now)
d = DatePart("d", Now)
h = DatePart("h", Now)
i = DatePart("n", Now)
s = DatePart("s", Now)
If m < 10 Then m = "0" & m
If d < 10 Then d = "0" & d
If h < 10 Then h = "0" & h
If i < 10 Then i = "0" & i
If s < 10 Then s = "0" & s
GetDateNow = y & "-" & m & "-" & d & " " & h & ":" & i & ":" & s
End Function
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function AddSlash(Path)
AddSlash = Path
While Right(AddSlash, 1) = "\"
AddSlash = Left(AddSlash, Len(AddSlash)-1)
Wend
AddSlash = AddSlash & "\"
End Function