VBS - Backup script

Un script de backup en vbs

Mars 2010

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

Téléchargement

backup_copy.zip