Ein Sicherungsscript das z.B. per "Geplante Tasks" ausgeführt werden kann.

Viele Parameter von WinRar bzw Rar sind nicht so einfach zu durchschauen.

Ein paar sinnvolle werden in diesem Script aufgezeigt / verwenden.

 

Das Script kann einfach per cscript rar.vbs gestartet werden. Dann müssen allerdings die Parameter im Script Bereich "Konfiguration" angepasst werden.

Genauso kann das Script mit Parameter gestartet werden cscript rar.vbs -p"geht keinen was an ;-)" d:\Sicherungspfad c:\quelle [c:\quelle2] [...]

Das Script durchsucht die gängigen Pfade nach der WinRar-Datei. Im Notfall in der Funktion getWinRarProg() anpassen.

 

RAR Parameter:

-p   Passwort um die Datei vor den öffen zu schützen
-v  

maximale Dateigröße. Wenn das Archiv größer wird muss gesplittet werden
Format:
Archiv001.rar

Archiv002.rar

Archiv003.rar

...

-vn   -> alte Schreibeise der gesplitteten Datei-Teile (wird hier im Script automatisch verwendet)
Format:
Archiv.rar

Archiv.r00

Archiv.r01

...
-sfx   Selbstentpackendes Archiv.exe erzeugen
-ep3  

Jedes LW in eingenem Pfad sichern
z.B:

c:\tmp und d:\tmp

würden sonst im Archiv im selben Unterordner landen \tmp so aber wird daraus

c_\tmp und d_\tmp

-rr  

Sollte das Archiv beschädigt werden so kann es repariert werden.
die Redundanz kann sich auf die Anzahl der Sektoren beziehen -rr500

oder in Prozent (%) -rr3%
Ohne Angabe wird etwa 1% verwendet -rr

-n   Datei-Filter mit Platzhaltern Es kann die Dateimenge eingeschränkt werden (mehrfach möglich -n*.doc -n*.pdf -n*.xls)
-x   diese Datei ausschließen (mehrfach möglich -x*.tmp -x*.mp3)

Script Parameter:

-a Anzahl Datei-Versionen 1(default)
Ältere Dateien im Sicherungsorder werden gelöscht
-b Backup-Typ -bf bedeutet immer die Kompletten Quell-Pfade sichern
-bi (incremental) nur neue oder veränderte Dateien werden in das nächste Archiv übernommen.
Nach Anzahl Datei-Version wird wieder ein Vollback erstellt.
-f

-fr Fileformat ist eine RAR-Datei. Angabe nicht notwendig da dies angeommen wird
-fz Eine ZIP-Archiv wird erstelle

Für das Zip Format müsste eingentlich der Schalter -afzip angegeben werden

   

Script-Link
Option Explicit
'...............................................................................................
'... rar.vbs 1.08   Autor: Michael Hölldobler hoelldobler[at]alant.de
'... Script benötigt eine Version des Rar-Packers
'... Packen:    rar.vbs (-Parameter1) (-Parameter2) (-..) Archiv-Pfad (Quelle1) (Quelle2) (..)
'... Entpacken: rar.vbs x (-p) Entpack-Ziel-Pfad Archiv.rar
'... Parameter:
'...   -pPasswort
'...   -hpPasswort (Ordnerstruktur verbergen)
'...   -bf Backup-Typ full (default) -bi (incremental)
'...   -fr Fileformat RAR(default) -fz ZIP
'...   -a1 Anzahl Datei-Versionen 1(default)
'...   -v1000 maximale Dateigröße danach wird gesplittet kb
'...   -sfx Selbstentpackendes Archiv.exe erzeugen
'...   -ep3 Jedes LW In eingenem Pfad sichern
'...   -rr oder -rr500 (Sectoren) oder % -rr3%  WiederherstellungsInformationen(1%)
'...   -n*.doc Filter Einschränkungen    (mehrfach möglich -n*.pdf -n*.xls)
'...   -x<file>  diese Datei ausschließen (mehrfach möglich -x*.tmp -x*.mp3)
'...
'...   Generell gilt:
'...     alle Start-Parameter mit Leerzeichen kapseln -> "mit Leerzeichen"
'...     Start-Parameter überschreiben die In der Konfiguration angegebenen Parameter  
'...     alle Parameter sind Optional
'...
'... Bezugsquellen:
'... WinRar http://www.winrar.de/
'... RAR engl.für DOS 3.60
'... http://suche.softwareload.de/fast-cgi/tsc?context=sl&mandant=toi&device=html&q=rar  
'...............................................................................................
Dim sourceFolders, destination, excludeFiles, password, rarProg, fileSize, sN, includeFileType
Dim oArgs, rarStages, backupTyp, fileFormat, siDate, Extract, sfx, noListing, recover
Dim fso, wsh, lw, s, sEx, sTmp, sDate, separateDrive, sSF, i, j
'--------------------------------------------------------------------------------------
'----- Konfiguration ------------------------------------------------------------------
'--------------------------------------------------------------------------------------
' Quellverzeichnisse
' Wichtig: Geben Sie bei den Quellpfaden keinen abschließenden Backslash an
' -------------------------------------------------------------------------
sourceFolders = Array("c:\tmp", "d:\tmp")
' Ausschlussdateien
' ------------------
' XP: Wenn Dokumente und Einstellungen gesichert werden soll
'excludeFiles = Array("NetworkService", "Default User", "LocalService", "Thumbs.db", "Cookies", "Druckumgebung", "IECompatCache", "IETldCache", "Netzwerkumgebung", "Recent", "SendTo", "Startmenü", "Temporary Internet Files", "Cache", "parent.lock", "Temp*", "*.tmp", "Thumbs.db", "*.lnk")
excludeFiles = Array("Cache", "parent.lock", "Temp*", "*.tmp", "Thumbs.db")
' Nur bestimmte Dateitypen packen
' -> "" "*" alle Dateien außer excludeFiles
' -> "*.doc", "*.xls", "*.pdf"
' -------------------------------
includeFileType = Array("*")
' Das Zielverzeichnis
' -------------------
destination = "d:\back up\sicherung"
' Archiv-Foramt
' -> "rar" oder "zip" (zip nur wenn WinnRAR vorhanden ist !)
' Hier gibt es noch Probleme bei ZIP wenn z.B Quelle mehr als 2 Ordner sind
' ----------------------------------------------------------
fileFormat = "rar"
' Passwort angeben
' -> "?" -> öffnet ein Eingabefenster
' -----------------------------------
password = ""
' Blick ins Archiv verwehren (Dateiliste)
' -> False oder True - Explorer kann nicht hineinschauen (Sowieso nur bei *.zip)
' ---------------------------------------
noListing = False
' Jedes LW In eingenen Pfaden sichern
' False oder True (nur wenn Anzahl sourceFolders > 1 und mehrere LW gesichert werden sollen)
'-------------------------------------------------------------------------------------------
separateDrive = True
' maximale Datei-Größe (In MB)
' -> "" 0 nicht splitten
' -> 50 100 200 500 1000 2000
' ---------------------------
fileSize = 0
' Anzahl Backups
'    1  -> Rar wird ohne Datum im Namen gesichert
' >= 2  -> Rar wird Datum im Namen gesichert 2009-10-30_full.rar
' --------------------------------------------------------------
rarStages = 1
' Backup Typ
' -> "f" => full (Es wird immer komplett gesichert. Viel Speicher wird benötigt)
' -> "i" => incremental (Nur Veränderungen sichern. Alle rarStages wird wieder ein Vollbackup angelegt)
'------------------------------------------------------------------------------------------------------
backupTyp = "i"
' Selbstentpackendes Archiv erzeugen
' -> False oder True (exe wird erzeugt. Rar wird nicht mehr benötigt zu eintpacken des Archivs)
' ---------------------------------------------------------------------------------------------
sfx = False
' Dateiname setzt sich aus dem aktuellen Datum und der Konstanten zusammen
' cFull für Vollbackup und cIncr für das inkrementelle Backup
' cFull sollte ungleich cIncr sein. Sind beide gleich wird immer ein Vollbackup erstellt
' --------------------------------------------------------------------------------------
Const cFull = "_full"
Const cIncr = ""
' Rar-Archiv Wiederherstellungs-Informationen mit einpacken
' "" (nicht), True (1%), x%, 500(Sectoren)  
'-----------------------------------------
recover = ""
'Extrahieren
' -> True oder False
'--------------
Extract = False

'--------------------------------------------------------------------------------------
'----- ENDE Konfiguration -------------------------------------------------------------
'--------------------------------------------------------------------------------------
Const cSpace = " "
Const cBSlash = "\"
Const cSlash = "/"
Const cDQ = """"
Set fso = CreateObject("Scripting.FileSystemObject")
Set wsh = CreateObject("WScript.Shell")
Set oArgs = WScript.Arguments
' Startparameter verarbeiten
openArgs()
' Rarpfad ermitteln
If getWinRarProg() And LCase(fileFormat) = "zip" Then
	fileFormat = " -afzip"
Else
	fileFormat = vbNullString
End If
' Prüfen ob das Ziel-Laufwerk vorhanden ist.
lw = UCase(Left(destination, 1))
If Not fso.DriveExists(lw & ":" ) Then
	wsh.PopUp "Laufwerk '" & lw & ":' nicht vorhanden !", 60 ', "",vbOK + vbError
	WScript.Quit
ElseIf Not fso.folderexists(destination) Then
	sTmp = "%COMSPEC% /C md " & enclose(destination)
	wsh.run sTmp
	If Not fso.folderexists(destination) Then
		wsh.PopUp "Der ZielPfad '" & destination & "' konnte nicht angelegt werden", 10 , _
		"RAR-Script-Fehler", vbOK + vbError
		WScript.Quit
	End If
End If
destination = Replace(destination, cSlash, cBSlash) 'Evtl. Slashes In Backslashes wandlen
If password = "?" Then password = InputBox("Passwort eingeben" & VbCrLf & "Wird nicht verschlüsselt angezeigt", "Passwort-Abfrage")
If password <> vbNullString Then
	password = enclose(password)
	If noListing Then
  	password = " -hp" & password
	Else
	 password = " -p" & password
	End If
End If
If fileSize <> vbNullString And CStr(fileSize) <> "0" Then
  fileSize = " -vn -v" & fileSize * 1024 & cSpace
Else
  fileSize = vbNullString
End If
If rarStages = 0 Then rarStages = 1
  i = UBound(includeFileType)
  If i = 1 Then
    If includeFileType(0) = vbNullString Or includeFileType(0) = "*" Then
      sN = vbNullString
    Else
      sN = " -n" & includeFileType(0)
    End If
  ElseIf i > 1 Then
  sN = " -n" & Join(includeFileType, " -n")
End If
i = UBound(excludeFiles)
If i > 0 Then
  excludeFiles = enclose(excludeFiles)
  sEx = " -x" & Join(excludeFiles, " -x")
End If

'Leerzeichen kaplseln
sourceFolders = enclose(sourceFolders)
If sfx Then
  Const cD = "Default.SFX" 'Grafische Entpackoberfläche
  'Const cW = "WinCon.SFX"  'Dos
  sTmp = GetPath_From_FilePath(rarProg) & cD
  If Not fso.FileExists(sTmp) Then
    i = wsh.PopUp("Die Datei '" & s & "' im RAR-Packerpfad " & vbcrlF & sTmp  & vbcrlF & _
    "wurde nicht gefunden." & vbcrlF & "Normales Archiv erzeugen." , 10 , _
    "Selbstenpakendes Archiv *.exe", vbYesNo + vbQuestion)
    If i = vbYes Then
    Else
      WScript.Quit
    End If
    sfx = vbNullString
  Else
    sfx = " -sfx" & enclose(sTmp)
  End If
Else
  sfx = vbNullString
End If

If recover = True Or LCase(recover) = "True" Then
  recover = " -rr"
ElseIf InStr(1, recover, "%") Or IsNumeric(recover) Then
  recover = " -rr" & Replace(recover, cSpace, vbNullString)
Else
  recover = vbNullString
End If
sDate = Year(Now) & "-" & addLeadingZero(Month(Now)) & "-" & addLeadingZero(Day(Now))
If separateDrive Then sSF = " -ep3"
If Extract Then
  wsh.CurrentDirectory = destination 'Ordner zum Entpacken festlegen
  For i = 0 To UBound(sourceFolders)
    s = rarProg & " x " & password & sourceFolders(i)
    '--- Folgende Zeile muss für den produktiven Betrieb auskommentiert werden. Nur für Test ---  
    's = InputBox ("Startaufruf um Rar zu starten", "Nur zur Info / Test", s)
    wsh.Run s, 1, True  
  Next
  s = Join(sourceFolders, vbCrLF)
  wsh.popup "Archiv(e) '" & s & "' wurde nach " & destination & " entpackt.", 6,  "Fertig"
  WScript.Quit
ElseIf fileRotate = True Or LCase(backupTyp) = "f" Then
  destination = enclose(destination & cBSlash & sDate & cFull)
  ' u           Dateien ins Archiv pachen (updaten)
  '-y          sag ja zu allem
  '-m4          Kompressionrate (0-nicht komprimieren...3-default...5-maximal)
  '-ms          keine Komprimiertung für 7z, ace, arj, bz2, cab, gz, jpeg, jpg, lha, lzh, mp3, rar, taz, tgz, z, zip
  '-ri1         Programm-Priorität setzen (0-default, 1-min..15-max) und Pausenzeit
  s = rarProg & " u -r -y -ri1 -ms" & sN & sSF & password & fileFormat & fileSize & sfx & sN & sEx & _
  recover & cSpace & destination & cSpace & Join(sourceFolders, cSpace)
  '--- Folgende Zeile muss für den produktiven Betrieb auskommentiert werden. Nur für Test ---  
  's = InputBox ("RAR", "Nur zur Info / Test", s)
  wsh.Run s, 1, True
  wsh.popup "RAR-Datei '" & destination & "' wurde erstellt.", 6,  "Fertig"
Else
Const XCOPYPARAMETER = " /S /C /I /Q /G /H /R /K /O /Y"
If LCase(cFull) = LCase(cIncr) Then
  If cFull = vbNullString Then
    cFull = "_full"
  Else
    cIncr = vbNullString
  End If
End If
s = CStr(FormatDateTime (siDate, 2)) '#11/31/2009 07:15:56 AM#  -> 31.11.2009 Deutsch !!
siDate = Mid(s, 4, 2) & "-" & Left(s, 2) & "-" & Right(s, 2)
sTmp = wsh.ExpandEnvironmentStrings("%temp%") & cBSlash & fso.GetTempName
For i = 0 To UBound(sourceFolders)
  If separateDrive Then
    sSF = cBSlash & Left(sourceFolders(i), 1) & "_"  
    Else
    sSF = vbNullString
  End If
  s = "xcopy " & enclose(sourceFolders(i)) & cSpace & enclose(sTmp & sSF & Right(sourceFolders(i), Len(sourceFolders(i)) - 2)) & _
  XCOPYPARAMETER & " /D:" & siDate
  '--- Folgende Zeile muss für den produktiven Betrieb auskommentiert werden. Nur für Test ---  
  's = InputBox ("XCOPY", "Nur zur Info / Test", s)
  wsh.Run s, 0, True
Next
If fso.folderexists(sTmp) Then
  destination = enclose( destination & cBSlash & sDate & cIncr)
  WScript.sleep 500
  '-ep1    Pfad bis zum sourceFolder abschneiden
  s = rarProg & " u -r -y -ri1 -ms -ep1" & password & fileFormat & fileSize & sfx & sN & sEx & recover & cSpace & destination &  cSpace & sTmp & "\*"
  '--- Folgende Zeile muss für den produktiven Betrieb auskommentiert werden. Nur für Test ---  
  's = InputBox ("Startaufruf um Rar zu starten", "Nur zur Info / Test", s)
  wsh.Run s, 0, True
  s = "%COMSPEC% /C rd /s /q " & sTmp
  wsh.Run  s, 0, True
  wsh.popup "RAR-Datei '" & destination & "' wurde erstellt.", 6,  "Fertig"
Else
  wsh.popup "Keine Dateien zum Updaten gefunden.", 6,  "Fertig"
End If
End If

'---------------------------------------------------------------------------------------
'--- Funktionen ------------------------------------------------------------------------
'---------------------------------------------------------------------------------------
Function addLeadingZero(number)
  If number < 10 Then number = "0" & number
  addLeadingZero = number
End Function

Function getWinRarProg()
  ' rar In allen möglichen Pfaden suchen
  Dim cR
  cR = Array("winrar.exe", "rar.exe", "rar32.exe")
  For i = 0 To 2
    ' rarProg = "PFAD_ZUR_WINRAR.EXE" 'eintragen falls sie nicht gefunden wird
    rarProg = wsh.ExpandEnvironmentStrings("%ProgramFiles%") & "\winrar\" & cR(i) 'c:\Programme\WinRar
    If Not fso.FileExists(rarProg) Then
      rarProg = wsh.ExpandEnvironmentStrings("%SystemDrive%") & "\winrar\" & cR(i)'c:\WinRar
      If Not fso.fileexists(rarProg) Then
        rarProg = Replace(WScript.ScriptFullName ,WScript.ScriptName, vbNullString) & cR(i) 'Scriptpfad
        If Not fso.FileExists(rarProg) Then
          rarProg = Replace(WScript.ScriptFullName ,WScript.ScriptName, vbNullString) & "\winrar\" & cR(i) 'Scriptpfad\winrar
          If Not fso.FileExists(rarProg) Then
            rarProg = wsh.ExpandEnvironmentStrings("%ProgramFiles%") & "\rar\" & cR(i) 'c:\Programme\rar
            If Not fso.FileExists(rarProg) Then
              rarProg = wsh.ExpandEnvironmentStrings("%SystemDrive%") & "\rar\" & cR(i) 'c:\rar
              If Not fso.FileExists(rarProg) Then
                rarProg = Replace(WScript.ScriptFullName ,WScript.ScriptName, vbNullString)  & "\rar\" & cR(i) 'Scriptpfad\rar
                If Not fso.FileExists(rarProg) Then
                Else : Exit For
                End If
              Else: Exit For
              End If
            Else: Exit For
            End If
          Else: Exit For
          End If
        Else : Exit For
        End If
      Else: Exit For
      End If
    Else: Exit For
    End If
  Next
  If i = 0 Then    
    getWinRarProg = True 'WinRAR
  Else
    getWinRarProg = False
  End If
  rarProg = enclose(rarProg)
End Function

Function fileRotate()
  Dim rs, desFolder, fNew
  On Error Resume Next
  Set desFolder = fso.GetFolder(destination)
  If Err.Number <> 0 Then
    fso.createfolder(destination)
    Err.Clear
    Set desFolder = fso.GetFolder(destination)
  End If
  On Error Goto 0
  fNew = True
  i = 0
  Set rs = BackupFolderRecordSet(desFolder)
  If Not (rs.Eof) Then
    fNew = True
    rs.Sort = "date DESC"  
    rs.MoveFirst
    If FormatDateTime(rs.fields("date"), 2) = FormatDateTime(Now, 2) And fileSize <> vbNullString Then
      ' heute wurde schon mal eine Rar erstellt und die Archive werden gesplittet. Gesplittete Archive können nicht upgedatet werden!
      s  = enclose(rs.fields("name"))
      s = "%COMSPEC% /C del /F /Q " & Left(s, Len(s) - 4) & "*"
      wsh.Run s, 0, True
      rs.Close
      Set rs = BackupFolderRecordSet(desFolder)
      If rs.RecordCount = 0 Then
        Exit Function
      Else
        rs.Sort = "date DESC"  
        rs.MoveFirst
      End If
    End If
    siDate = rs.fields("date")
    Do Until rs.Eof
      If i >= rarStages Then
        'Set sPath = fso.getdestination
        s = "%COMSPEC% /C del /F /Q " & enclose(rs.fields("name"))
        wsh.Run s, 0, True
        WScript.sleep 500
      Else
        If InStr(1, rs.fields("name"), cFull) Then fNew = False
      End If
      i = i + 1
      rs.MoveNext
    Loop
  Else
  '   fNew = False
  End If
  fileRotate = fNew
End Function

Function BackupFolderRecordSet(folder)
  Dim aFiles
  ' Konstanten für ADO
  Const adVarChar = 200
  Const adDate = 7
  ' Feldnamen fürs RecordSet
  Dim rsFieldNames
  rsFieldNames = Array("name", "date")
  Set BackupFolderRecordSet = CreateObject("ADODB.RecordSet")
  With BackupFolderRecordSet
    .Fields.Append "name", adVarChar, 255
    .Fields.Append "date", adDate
    .Open
    For Each aFiles In folder.Files
      If Left(aFiles.Name, 2) = "20" And (Right(aFiles.Name, 4) = ".rar" Or Right(aFiles.Name, 4) = ".zip") Then ' nur die Datumsordner In die Liste aufnehmen
        .addnew rsFieldNames, Array(aFiles.Path, aFiles.DateCreated)
      End If
    Next
  End With
End Function

Function GetPath_From_FilePath(sFilePath)
  sFilePath = Replace(sFilePath, cSlash , cBSlash)
  GetPath_From_FilePath = Left(sFilePath,  InStrRev(sFilePath, cBSlash))
  If Left(GetPath_From_FilePath, 1) = cDQ Then GetPath_From_FilePath = Right(GetPath_From_FilePath, Len(GetPath_From_FilePath)- 1 )
End Function

Function openArgs()
  Dim sOA, s, s2, n, x
  Dim fDestination
  fDestination = False
  j = 0
  x = 0
  n = 0
  If oArgs.Count = 0 Then
    'Abfangen wenn kein Argument übergeben wurde
  Else
    For i = 0 To oArgs.Count - 1
      On Error Resume Next
      sOA =LCase(oArgs(i))
      If sOA = "x" Or sOA = "e" Then       'ohne führendes Minuszeichen
        Extract = True                     'Entpacken
      ElseIf sOA = "-sfx" Then
        sfx = True                         'Selbstentpackendes Archiv
        ElseIf sOA = "-ep3" Then
        separateDrive = True
      ElseIf sOA = "-afzip" Then
        fileFormat = "ZIP"                            
      ElseIf Left(sOA, 1) = "-" Then       'Parameter
        s = Left(sOA, 2)
        s2 = Right(sOA,Len(sOA) -2)
        Select Case s
          Case "-a": rarStages = s2        'Anzahl der Kopien
          Case "-b": backupTyp = s2        'Backupart f
          Case "-v": fileSize  = s2        'Dateigröße nachdem gesplittet wird  
          Case "-p": password  = s2        'Passwort
          Case "-n"                         'Dateien/Ordner einschließen
            ReDim Preserve includeFileType(n)
            includeFileType(n) = sOA
            n = UBound(includeFileType) + 1      
          Case "-x"                         'Dateien/Ordner ausschließen
            ReDim Preserve excludeFiles(x)
            excludeFiles(x) = sOA
            x = UBound(excludeFiles) + 1      
          Case "-f":                       'Packformat  
            If s2 = "z" Then
              fileFormat = "ZIP"                        
            Else
              fileFormat = "RAR"
            End If
          Case Else
            s = LCase(Left(sOA, 3))
            If s = "-hp" Then
              password  = s2
              noListing = True
            ElseIf s = "-rr" Then
              rerecover = sOA
            End If  
        End Select
      Else
        If Not fDestination Then           'Ziel-Datei
          destination = sOA
          fDestination = True
        Else                               'Quellen
          If Extract Then
            If Not (Right(sOA, 4) = ".rar" Or Right(sOA, 4) = ".zip") Then
              wsh.PopUp "Als letzte Parameter müssen Rar oder Zip Archive angegeben werden !", 15
              WScript.Quit
            End If
          Else
            ReDim Preserve sourceFolders(j)
            sourceFolders(j) = sOA
            j = UBound(sourceFolders) + 1    
          End If
        End If
      End If        
      On Error Goto 0
    Next
  End If  
End Function^

Function enclose(v)
  Dim va
  va = v
  If IsArray(va) Then
    For i = 0 To UBound(va)
      s = Replace(va(i), cSlash, cBSlash)
      If InStr(1, s, cSpace) Then
        va(i) = cDQ & s & cDQ
      Else
        va(i) = s
      End If
    Next
  ElseIf va <> vbNullString Then
    va = Replace(va, cSlash, cBSlash)
    If InStr(1, va, cSpace) Then va = cDQ & va & cDQ
  End If
  enclose = va
End Function

'Function SetDrive(LW)
  'net use e: \\financial\letters /persistent:no
  'net use e: /delete
  'End Function
  'Function GetFreeDrive(LW)
  'Dim i
  'for i = 97 To 122
  '  s = Chr(i)
  '  If Not fso.DriveExists(s & ":") then
  '    LW = s
  '  End If
  'Next
'End Function