RAR Archiv Packen / Entpacken

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