none
Backup überprüfen mit powershell RRS feed

  • Frage

  •  

    Hallo liebe Leute,

    Ich bin neu hier und hoffe ich mach alles richtig =)

    Ich habe eine Frage bezüglich meinem Script in Powershell. Diese verwendet die VMware vSphere PowerCLI. Aufgabe war:

    1. Zu einem Server Connecten und die Virtuellen Maschinen im Cluster auflisten

    2. Für jede VM in einem Ordner nach dem Ordner mit dem VM Namen Suchen

    3. In diesem Ordner die *.sna Datei Suchen und überprüfen ob diese älter ist als 7 Tage.

    4 Falls Sie älter ist als 7 Tage -> Name in LogFile + Datum der *.sna Datei speichern.

    5. Wenn alle VMs durch sind Logfile an email@dresse schicken.

    Mein Script sieht bisher so aus:

    $BackupPath = "C:\temp\VM_Backups\"
      $LogPath = "C:\temp\Logs\"
      
      Start-Transcript -path $Logpath (get-date -format g) ".txt"  #funktioniert noch nicht...soll ein logfile mit dem datum als name ausgeben
      
      Add-PSSnapin VMware.VimAutomation.Core                #lädt die powerCLI Cmdlets
      Connect-VIServer -server #SERVERNAME                  #connectet zum server
      $vms = Get-Cluster -Name "RZ_Cluster" | Get-VM | Sort Name #liest die VMs aus
      
      foreach ($i in $vms)                                     #ab hier müssen nun die Backups geprüft werden
      {
        get-childitem $BackupPath | Sort Name 
       }

     

    Datum der *.sna datei Prüfen müsste doch mit (get-date).AddDays(-7) funktionieren... aber wie muss ich das in eine if anweisung verpacken oder geht das auch anders?

    Ich hoffe ihr könnt mir etwas helfen =) sitz schon seit Anfang Dezember da dran und es geht einfach nicht vorwärts.

    Danke

    P.S. Ich bin für jede kleine Verbesserung oder Idee eurerseits offen und dankbar

    Grüße Jonny

    wie kann ich nun nach dem name der VM den Ordner suchen?
    • Typ geändert Jonny7988 Freitag, 21. Januar 2011 07:20 Frage gestellt... keine diskussion
    • Bearbeitet Jonny7988 Freitag, 21. Januar 2011 09:25
    Donnerstag, 20. Januar 2011 10:29

Antworten

  • Problem gelöst!

    Code:

    function Check-Backup
    {
      Set-Location "C:\temp"
      $BackupPath = "C:\temp\VM_Backups\"
      $LogPath = "C:\temp\Logs\log_" + (get-date -format yyyy-MM-dd_hh-mm) + ".txt"
      $date = (get-date).AddDays(-7)
      
        
      Add-PSSnapin VMware.VimAutomation.Core #lädt die powerCLI Cmdlets
      Connect-VIServer -server srv01vc1 
      $vms = Get-Cluster -Name "RZ_Cluster" | get-vm | select name | Sort Name
       
        
      foreach ($vmname in $vms)
      {
        $vmname = $vmname.name.tostring()
        $foldername = ($vmname.split("_"))[0]
        $sna = (Get-Item ($BackupPath + $foldername + "\*.sna"))
            if ($sna.LastWriteTime -lt $date)
        { $logtext = "Die Datei " + $sna.name + " im Ordner " + $foldername + " ist vom " + $sna.LastWriteTime + "!!!" 
        add-content $LogPath $logtext}
        
       }  
                
    }
    
    Danke an alle Helfenden =)
    • Als Antwort markiert Jonny7988 Freitag, 21. Januar 2011 12:44
    Freitag, 21. Januar 2011 12:43

Alle Antworten

  • Hi, ich kann den VM-Teil nicht testen, daher gehe ich mal davon aus, das $vms eine Liste von VM-Namen enthält:
    Für jeden Namen in $vms wird ein Ordner unterhalb von $backuppath gleichen Namens erwartet, innerhalb dieses Ordners wird eine Datei mit der Endung .sna erwartet. Von dieser wird das letzte Schreibdatum gelesen und mit dem aktuellen Datum verglichen und wenn 7 Tage oder älter, der Name des Ordners, der Datei und das Datum der Datei in ein Log geschrieben.

    $backuppath = "D:\test"
    $date = get-date
    $logfile = "D:\SNAlog.txt"
    
    foreach ($vmname in $vms) {
     $sna = (Get-Item "$backuppath\$vmname\*.sna")   # Dateiobjekt laden
     if (($date-$sna.LastWriteTime).totaldays -ge 7) {  # Daten voneinander subtrahieren, wenn Tage >= 7 
     $logtext = "Die Datei "+$sna.name+" im Ordner $vmname ist vom "+$sna.LastWriteTime+"." #Ausgabetext generieren
     add-content $logfile $logtext      # Ausgabe in Logdatei
     }
    }
    


    Probiers mal aus und poste falls es noch Probleme oder Fragen gibt.

    Grüße, Denniver

    Donnerstag, 20. Januar 2011 14:12
    Moderator
  • Vielen Dank erstmal.

    Deine Annahme war richtig, jetzt habe ich nur noch das Problem, dass der Name der VM nicht exakt der Name des Ordners ist sondern noch einen Zusatz hat der jedes mal mit _ beginnt und dann noch ein Text folgt. Also so: vmname01_asd, vmname02_xyz, vmname03_asdf usw. usf.

    Nun meine Frage: Ist es möglich diesen teil abzuschneiden, sprich - "_*" bei jedem VM name zu machen?

    Danke.

    Grüße Jonny

     

    Donnerstag, 20. Januar 2011 14:39
  • Wenn der eigentliche Name immer vorm ersten "_" kommt, dann z.b. mit ($vmname.split("_"))[0] . Damit trennst du den String beim Zeichen "_" und wählst dann mit [0] den ersten Teil aus. Der ganze Code sieht dann so aus:

    $backuppath = "D:\test"
    $date = get-date
    $logfile = "D:\SNAlog.txt"
    
    foreach ($vmname in $vms) {
     $foldername = ($vmname.split("_"))[0]
     $sna = (Get-Item "$backuppath\$foldername\*.sna") # Dateiobjekt laden
     if (($date-$sna.LastWriteTime).totaldays -ge 7) { # Daten voneinander subtrahieren, wenn Tage >= 7 
     $logtext = "Die Datei "+$sna.name+" im Ordner $vmname ist vom "+$sna.LastWriteTime+"." #Ausgabetext generieren
     add-content $logfile $logtext # Ausgabe in Logdatei
     }
    }
    
    Grüße, D.

    Achja, ändere doch bitte den Typ deines Ursprungsposting noch in "Frage" (statt "Diskussion" wie jetzt).
    Donnerstag, 20. Januar 2011 14:50
    Moderator
  • Es klappt..... soweit bis darauf das ich eine Fehlermeldung bekomme wenn ich den VMname splitten möchte.

     foreach ($vmname in $vms)
     {
      $foldername = ($vmname.split("_"))[0]
      $sna = (Get-Item ($BackupPath + $foldername + "\*.sna"))
      if ($date -lt $sna.LastWriteTime)
      { $logtext = "Die Datei " + $sna.name + " im Ordner " + $vmname + "ist vom " + $sna.LastWriteTime + "." 
      add-content $LogPath $logtext}
      }
    

    Das ist nun mein Code. Er gibt mir diese Fehlermeldung:

    Method invocation failed because [Selected.VMware.VimAutomation.ViCore.Impl.V1.Inventory.VirtualMachineImpl] doesn't contain a method named 'split'.
    At C:\temp\Skript0_1b.ps1:40 char:37
    +         $foldername = ($vmname.split <<<< ("_"))[0]
        + CategoryInfo          : InvalidOperation: (split:String) [], RuntimeException
        + FullyQualifiedErrorId : MethodNotFound

     Ich vermute, dass mir die operation:

    $vms = Get-Cluster -Name "RZ_Cluster" | get-vm | select name | Sort Name
    

    keinen String ausgibt von dem ich etwas wegschneiden kann.

    Es gibt aus :

    $vmname
    
    Name                                          
    ----                                          
    srv01epm1_xXxXaya 
    

    ich habe auch schon versucht:

    $foldername = ($vmname.tostring().split("_"))[0]
    

     jedoch ist dann $vmname leer =(

    Ich hoffe jemand kann mir weiterhelfen, denn ansonsten funktioniert alles!

    CODE:

      Set-Location "C:\temp"
      $BackupPath = "C:\temp\VM_Backups\"
      $LogPath = "C:\temp\Logs\log.txt"
      $date = (get-date).AddDays(-7)
      
      
      Add-PSSnapin VMware.VimAutomation.Core #lädt die powerCLI Cmdlets
      Connect-VIServer -server srv01vc1 
      $vms = Get-Cluster -Name "RZ_Cluster" | get-vm | select name | Sort Name
          
      foreach ($vmname in $vms)
      {
        $vmname = $vmname.tostring()
        $foldername = ($vmname.split("_"))[0]
        $sna = (Get-Item ($BackupPath + $foldername + "\*.sna"))
        #$sna = (Get-Item "$BackupPath\$foldername\*.sna")
        if ($date -lt $sna.LastWriteTime)
        { $logtext = "Die Datei " + $sna.name + " im Ordner " + $vmname + "ist vom " + $sna.LastWriteTime + "." 
        add-content $LogPath $logtext}
       }  
    Freitag, 21. Januar 2011 09:23
  • Problem gelöst!

    Code:

    function Check-Backup
    {
      Set-Location "C:\temp"
      $BackupPath = "C:\temp\VM_Backups\"
      $LogPath = "C:\temp\Logs\log_" + (get-date -format yyyy-MM-dd_hh-mm) + ".txt"
      $date = (get-date).AddDays(-7)
      
        
      Add-PSSnapin VMware.VimAutomation.Core #lädt die powerCLI Cmdlets
      Connect-VIServer -server srv01vc1 
      $vms = Get-Cluster -Name "RZ_Cluster" | get-vm | select name | Sort Name
       
        
      foreach ($vmname in $vms)
      {
        $vmname = $vmname.name.tostring()
        $foldername = ($vmname.split("_"))[0]
        $sna = (Get-Item ($BackupPath + $foldername + "\*.sna"))
            if ($sna.LastWriteTime -lt $date)
        { $logtext = "Die Datei " + $sna.name + " im Ordner " + $foldername + " ist vom " + $sna.LastWriteTime + "!!!" 
        add-content $LogPath $logtext}
        
       }  
                
    }
    
    Danke an alle Helfenden =)
    • Als Antwort markiert Jonny7988 Freitag, 21. Januar 2011 12:44
    Freitag, 21. Januar 2011 12:43