none
Frage zu einem Backup-Skript (Powershell-Neuling) RRS feed

  • Allgemeine Diskussion

  • Hallo,

    ich habe ein Backup-Skript im Internet gefunden, und dieses auf meine Bedürfnisse angepasst. Kurze Erklärung: Das Skript soll erst ein vorhandenes Backup-Template starten, welches ein Backup auf eine NAS macht, die per iSCSI an den Server (VM auf einem Hyper-V) angebunden ist. Sobald dieser Job abgeschlossen ist, soll ein Backup auf die am NAS-Storage angebundene USB-Platte durchgeführt werden.

    Das Problem, welches ich habe, wenn ich das Backup-Template im Skript aufrufe, soll powershell eigentlich warten, bis das fertig ist, und erst dann weiter machen, dies mache ich mit start process wbadmin start backup... -wait. Allerdings scheint das Argument -wait nicht zu klappen, da das Skript sofort weitermacht und dann sofort das nächste Backup auf die USB-Platte machen möchte. Das bricht dann aber ab, da ja noch das erste Backup läuft

    Was mache ich falsch?

    # Windows Server Backup on NAS and USB Hard disk
    ############# Costants #############
    $mailServer = "mailserver"
    $mailFrom = "NASbackup.domain.com"
    $mailTo = "julian@domain.com"
    $BackupDir = "\\NASStorage\usbshare1"
    $ValidPath = Test-Path -Path $BackupDir
    $wbadminPath = "c:\Windows\System32"
    $templid = "{cae4f110-fc0c-4c68-9232-f9482838e859}"

    Write-Host $templid
    Start-Process "$wbadminPath\wbadmin.exe" -ArgumentList "start backup -quiet -templateId:{cae4f110-fc0c-4c68-9232-f9482838e859}" -Wait

    If ($ValidPath -eq $True) {$BackupDir = "\\NASStorage\usbshare1"}
    Else {$BackupDir = "\\NASStorage\usbshare2"}

    Write-Host $BackupDir


    ############# Backup #############
    # add Windows Server Backup snap-in
    if((get-pssnapin windows.serverbackup -ErrorAction SilentlyContinue) -eq $null)
    {add-pssnapin windows.serverbackup}

    # create daily backup folder
    $DayofWeek = (get-date).DayOfWeek
    $BackupDir = "$BackupDir\$DayOfWeek"
    if(!(test-path $BackupDir -pathtype container))
    {new-item $BackupDir -type directory}

    $policy = New-WBPolicy

    # files (not used)
    # $fileSpec = New-WBFileSpec -FileSpec <nome_file>
    # Add-WBFileSpec -Policy $policy -FileSpec $filespec

    # C volume
    $volume = Get-WBVolume -VolumePath C:,D:
    Add-WBVolume -Policy $policy -Volume $volume

    # system state and bare metal recovery
    Add-WBSystemState $policy
    Add-WBBareMetalRecovery $policy

    $backupLocation = New-WBBackupTarget -NetworkPath $BackupDir
    Add-WBBackupTarget -Policy $policy -Target $backupLocation

    # Backup-Exclusions
    $filespec1 = New-WBFileSpec -FileSpec D:\TEMP -Exclude
    Add-WBFileSpec -Policy $policy $filespec1
     
    Set-WBVssBackupOptions -Policy $policy -VssCopyBackup

    # execute backup
    Start-WBBackup -Policy $policy

    ############# Send email #############
    $mailTitle = "Windows Server Backup $env:computername"
    $mailBody = "get-wbjob -previous 2"

    $mailClient = new-object Net.Mail.SmtpClient -arg $mailServer
    $mailClient.Send($mailFrom, $mailTo, $mailTitle, $mailBody)

    vielen Dank für Eure Hilfe!

    Julian

    Dienstag, 13. März 2012 13:34

Alle Antworten

  • Wenn du mit Server einen Windows Server 2008 R2 meinst, dann solltest du statt der wbadmin.exe die
    <Windows Server Backup Cmdlets in Windows PowerShell> nutzen.
    http://technet.microsoft.com/de-DE/library/ee706683.aspx

    wbadmin.exe startet einen Job (Prozess)!!!!!!

    Wenn nicht, schau dir mal die Ausgabe von folgendem Befehl an: ;-))

     wbadmin /?

    Und dann schau hier !
    http://trevorsullivan.net/2011/12/30/checking-status-of-a-windows-7-system-image/

    folgender Aufruf ist die Lösung
    wbadmin.exe get status


    Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '

    Dienstag, 13. März 2012 15:27
  • Hi Peter,

    ja, ich habe eine 2008 R2 (sorry, hatte ich vergessen mit anzugeben). Mir ist es aber nicht gelungen mit den Backup Cmdlet in Windows Powershell einen Backup-Job mittels Template-ID zu starten! Oder habe ich das nur überlesen...?

    Und meine zweite Frage ist, wie muss ich denn den wbadmin get status in mein Backup-script einbauen, habe obiges Skript mal mit diesen Zeilen aktualisiert, aber funktioniert nicht, er macht dann gleich weiter, und fällt mit dem nächsten Backup auf die USB-Platte auf die Nase...


    Start-Process "$wbadminPath\wbadmin.exe" -ArgumentList "start backup -quiet -templateId:{cae4f110-fc0c-4c68-9232-f9482838e859}"
    Start-Process "$wbadminPath\wbadmin.exe" -ArgumentList "get status" -Wait

    • Bearbeitet Julian79 Dienstag, 13. März 2012 16:51
    Dienstag, 13. März 2012 16:06
  • Ich kenne mich mit den WB-backups nicht aus !
    Ich habe mich aber nun ein wenig belesen und verstehe das so:
    Das Template ist ein Policy
    Der Parameter -TemplateID ist nichts anderes als ein (Spezieller) Scheduled-Task der dann das Backup mit der Policy über eine GUID aufruft.

    In addition, you can use the Local Group Policy Editor snap-in (Gpedit.msc) to allow or disallow certain types of backups or backup locations.
    Policy settings for Windows Server Backup are located at: Local Computer Policy\Computer Configuration\Administrative Templates\Windows Components\Backup\Server.

    http://forum.wegotserved.com/index.php/topic/19082-server-backup-solving-the-2tb-limit/

    Da nun der Task-Sheduler-Dienst alles in der Hand hat kommst du an deinen Job nicht mehr heran.
    (Fire and forget…) Da hilft dir auch kein get status !

    Vergiss das mit dem Template und erstelle dir dein „eigenes“!

    Deshalb empfehle ich die folgende Vorgehensweise:

    Erstelle mit den WB Backup comandlets eine script mit dem du das Backup und deine anderen Aufgaben erledigst (Backup.ps1).
    In dem Script  kannst du beide Backups nacheinander erstellen.
    Für diese Script erstellst du einen Sheduled-Task in dem das Script aufgerufen wird:
    PowerShell.exe –command c:\pfad\zum\script\backup.ps1

    http://certcollection.org/forum/topic/99672-windows-server-2008-r2-and-windows-backup/
    http://richardspowershellblog.wordpress.com/2008/01/11/powershell-for-windows-server-backup/

    Mehr kann ich dir leider nicht helfen!


    Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '

    Mittwoch, 14. März 2012 08:25
  • Hi Peter,

    ich habe es jetzt zum Laufen bekommen. Ich musste jeweils ein "-wait" einbauen:

    Start-Process "$wbadminPath\wbadmin.exe" -ArgumentList "start backup -quiet -templateId:{cae4f110-fc0c-4c68-9232-f9482838e859}" -Wait
    Start-Process "$wbadminPath\wbadmin.exe" -ArgumentList "get status" -Wait

    Dann funktioniert es sauber! Aber dein Ansatz ist auch nicht so verkehrt!

    Letze aber nun wirklich einfache Frage (du weisst ja, bin ein Powershell-Neuling):

    Wenn das Backup abgeschlossen ist, lass ich mir den Output der letzten beiden Backups per Email senden, das geht mit folgendem Befehl:

    ############# Send email #############
    $mailTitle = "Windows Server Backup $env:computername"
    $mailBody = "get-wbjob -previous 2"

    $mailClient = new-object Net.Mail.SmtpClient -arg $mailServer
    $mailClient.Send($mailFrom, $mailTo, $mailTitle, $mailBody)

    In der Email bekomme ich aber statt dem Output des "get-wbjob -previous 2" nur eben den Befehl selbst also "get-wbjob -previous 2" angezeigt!

    Ist ne echte Anfänger-Frage, ich weiss... :-)

    Mittwoch, 14. März 2012 11:32
  • Wie in der Mathematik Klammern werden von innen nach aussen ausgeführt (innerste klammer zuerst).
    Damit das ergebnis das die Klammer herstellt weitergegeben werden kann das Dollarzeichewn voranstellen.

    Siehe Get-Help about_Operators

    Teilausdruckoperator:
    $ () Beschreibung: Gibt das Ergebnis einer oder mehrerer Anweisungen zurück. Gibt einzelne Ergebnisse als Skalar zurück. Gibt mehrere Ergebnisse als Array zurück. Beispiele: $($x * 23) $(Get-WMIObject win32_Directory)

    $mailBody = $(get-wbjob -previous 2)



    Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '

    Mittwoch, 14. März 2012 12:00
  • habe das "$mailBody = $(get-wbjob -previous 2)" in meinen Job eingebaut, aber immer noch das gleiche Problem, in der Email steht nun:

    Microsoft.Windows.ServerBackup.Commands.WBJob

    Microsoft.Windows.ServerBackup.Commands.WBJob

    Und nicht der Output! :-(
    Mittwoch, 14. März 2012 12:59
  • get-wbjob kann auch nicht funktionieren da es nur den Status des aktuell laufenden Jobs ausliest!
    http://technet.microsoft.com/en-us/library/ee706654.aspx

    WBadmin.exe schreibt ein Log File in : "C:\Windows\Logs\WindowsServerBackup"
    Das kannst du mit Get-Content in deinen Mailbody einlesen.

    Ich konnte nicht herausbekommen wo Start-WBBackup sein Log File anlegt oder wie man eines macht.
    Ich nehmen mal an das Start-WBBackup auch ein Log im selben Pfad anlegt.

    Mehr kann ich dir dazu nicht helfen… wie gesagt, ich habe noch nie ein backup gemacht.

    Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '


    Mittwoch, 14. März 2012 14:45
  • Bist du hier zwischenzeitlich weitergekommen, Julian?

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    Montag, 19. März 2012 16:53
    Moderator
  • Hallo Julian,

    mach Dir eine Schleife in der das eigendliche Backup-Script aufgerufen wird.

    $x = get-content "c:\listederzusicherndenserver.txt"

    Foreach ($i In $x)
    {
    invoke-command -filepath c:\sicherung.ps1 -computername $i
    }

    dann noch zu den Logs, wenn Du in Deinem Backup-Script die Ausgabe in eine Datei leitest (Datum und Servernamen in den Dateinamen) bekommst Du die volle Übersicht in Prozent und den Abschluss.

    Im Ereignisprotokoll "WindowsServerBackup"

    27.07.2011 20:07:41 Microsoft-Windows-Backup 14 Die Sicherung ist abgeschlossen.              
    27.07.2011 20:07:41 Microsoft-Windows-Backup  4 Die Sicherung wurde erfolgreich abgeschlossen.
    27.07.2011 20:00:15 Microsoft-Windows-Backup  1 Die Sicherung wurde gestartet. 

    Gruß

    Armin

    Freitag, 23. März 2012 08:37