none
Alle Snapshot Reports in EINE E-Mail RRS feed

  • Frage

  • Ich habe ein Snapshot Skript, welches alle Snapshots in einer E-Mail verschicken soll.

    Allerdings tut es das nicht. Es gibt für jedes Snapshot eine einzelne E-Mail.

    Ich weiß, dass es bestimmte "Schleifen" gibt, mit denen Dieses Problem behoben werden kann, allerdings habe ich keine Ahnung welche "Schleife" und wo diese hingesetzt werden müsste. 

    Hier das Skript: 

               

    [Array] $vmList = @( Get-VM -Location $vParam | Sort Name );

    foreach ( $vmItem in $vmList )
    {
        [Array] $vmSnapshotList = @( Get-Snapshot -VM $vmItem );

        foreach ( $snapshotItem in $vmSnapshotList )
        {
            $vmProvisionedSpaceGB = [Math]::Round( $vmItem.ProvisionedSpaceGB, 2 );
            $vmUsedSpaceGB        = [Math]::Round( $vmItem.UsedSpaceGB,        2 );
            $snapshotSizeGB       = [Math]::Round( $snapshotItem.SizeGB,       2 );
            $snapshotAgeDays      = ((Get-Date) - $snapshotItem.Created).Days;

            $output = New-Object -TypeName PSObject;

            $output | Add-Member -MemberType NoteProperty -Name "VM"                 -Value $vmItem;
            $output | Add-Member -MemberType NoteProperty -Name "Name"               -Value $snapshotItem.Name;
            $output | Add-Member -MemberType NoteProperty -Name "Description"        -Value $snapshotItem.Description;
            $output | Add-Member -MemberType NoteProperty -Name "Created"            -Value $snapshotItem.Created;
            $output | Add-Member -MemberType NoteProperty -Name "AgeDays"            -Value $snapshotAgeDays;
            $output | Add-Member -MemberType NoteProperty -Name "ParentSnapshot"     -Value $snapshotItem.ParentSnapshot.Name;
            $output | Add-Member -MemberType NoteProperty -Name "IsCurrentSnapshot"  -Value $snapshotItem.IsCurrent;
            $output | Add-Member -MemberType NoteProperty -Name "SnapshotSizeGB"     -Value $snapshotSizeGB;
            $output | Add-Member -MemberType NoteProperty -Name "ProvisionedSpaceGB" -Value $vmProvisionedSpaceGB;
            $output | Add-Member -MemberType NoteProperty -Name "UsedSpaceGB"        -Value $vmUsedSpaceGB;
            $output | Add-Member -MemberType NoteProperty -Name "PowerState"         -Value $snapshotItem.PowerState;

            $output;



            # Send Email Message
            Send-Mailmessage -smtpServer "Mailserver" -from "E-Mail Adresse" -to "E-Mail Adresse" -subject "Snapshot Report" -body $output; -bodyasHTML -priority High -encoding ([System.Text.Encoding]::UTF8) 

        } # End Send Message

    } # End User Processing



    # End

    Danke schon mal, für eure Hilfe


    • Bearbeitet T.M.K Donnerstag, 24. Mai 2018 08:50
    Donnerstag, 24. Mai 2018 08:48

Antworten

  • T.M.K.,

    Hallo erstmal und Willkommen im deutschen Powershell forum.

    Von mir auch die Bitte, Deinen Code in Zukunft als Code zu formatieren. Es liest sich so leichter und man kann ihn auch besser kopieren und es gibt keine Zeilenumbrüche, wo keine hingehören.

    Du machst Dir das Leben ein bissl schwer ...  Du kannst erst mal alles "einsammeln", was Du in der Mail haben willst und das dann als Ganzes wegschicken .... so ungefähr:

    [Array]$vmList = @( Get-VM -Location $vParam | Sort-Object -Property Name )
    
    $SnapShotList = foreach ( $vmItem in $vmList ) {
        [Array] $vmSnapshotList = @( Get-Snapshot -VM $vmItem )
    
        foreach ( $snapshotItem in $vmSnapshotList ) {
            $vmProvisionedSpaceGB = [Math]::Round( $vmItem.ProvisionedSpaceGB, 2 )
            $vmUsedSpaceGB = [Math]::Round( $vmItem.UsedSpaceGB, 2 )
            $snapshotSizeGB = [Math]::Round( $snapshotItem.SizeGB, 2 )
            $snapshotAgeDays = ((Get-Date) - $snapshotItem.Created).Days
    
            [PSCustomObject]@{
                "VM"                 = $vmItem
                "Name"               = $snapshotItem.Name
                "Description"        = $snapshotItem.Description
                "Created"            = $snapshotItem.Created
                "AgeDays"            = $snapshotAgeDays
                "ParentSnapshot"     = $snapshotItem.ParentSnapshot.Name
                "IsCurrentSnapshot"  = $snapshotItem.IsCurrent
                "SnapshotSizeGB"     = $snapshotSizeGB
                "ProvisionedSpaceGB" = $vmProvisionedSpaceGB
                "UsedSpaceGB"        = $vmUsedSpaceGB
                "PowerState"         = $snapshotItem.PowerState
            } # End PSCustomObject
        } # End foreach vmSnapshotList
    } # End foreach vmList
    
    Send-Mailmessage -smtpServer "Mailserver" -from "E-Mail Adresse" -to "E-Mail Adresse" -subject "Snapshot Report" -body $SnapShotList -bodyasHTML -priority High -encoding UTF8
    ... ungetestet ....


    Best regards,

    (79,108,97,102|%{[char]$_})-join''




    Donnerstag, 24. Mai 2018 09:11
  • Hallo T.M.K,

    zunächst, poste deinen Code doch bitte auch immer als 

    Code

    damit wir ihn besser lesen können.

    Du verwendest ja schon zwei Schleifen. (foreach)

    Wenn du das Senden der Mail nicht in deiner zweiten Schleife machst, sondern in der ersten, sendet es eine Mail nach jeder VM.

    Wenn du das Senden der Mail am Ende von beiden Schleifen machst, sendet es eine Mail am Ende des Skripts.

    Hierfür müsstest du aber deinen Output anpassen.

    Donnerstag, 24. Mai 2018 09:05

Alle Antworten

  • Hallo T.M.K,

    zunächst, poste deinen Code doch bitte auch immer als 

    Code

    damit wir ihn besser lesen können.

    Du verwendest ja schon zwei Schleifen. (foreach)

    Wenn du das Senden der Mail nicht in deiner zweiten Schleife machst, sondern in der ersten, sendet es eine Mail nach jeder VM.

    Wenn du das Senden der Mail am Ende von beiden Schleifen machst, sendet es eine Mail am Ende des Skripts.

    Hierfür müsstest du aber deinen Output anpassen.

    Donnerstag, 24. Mai 2018 09:05
  • T.M.K.,

    Hallo erstmal und Willkommen im deutschen Powershell forum.

    Von mir auch die Bitte, Deinen Code in Zukunft als Code zu formatieren. Es liest sich so leichter und man kann ihn auch besser kopieren und es gibt keine Zeilenumbrüche, wo keine hingehören.

    Du machst Dir das Leben ein bissl schwer ...  Du kannst erst mal alles "einsammeln", was Du in der Mail haben willst und das dann als Ganzes wegschicken .... so ungefähr:

    [Array]$vmList = @( Get-VM -Location $vParam | Sort-Object -Property Name )
    
    $SnapShotList = foreach ( $vmItem in $vmList ) {
        [Array] $vmSnapshotList = @( Get-Snapshot -VM $vmItem )
    
        foreach ( $snapshotItem in $vmSnapshotList ) {
            $vmProvisionedSpaceGB = [Math]::Round( $vmItem.ProvisionedSpaceGB, 2 )
            $vmUsedSpaceGB = [Math]::Round( $vmItem.UsedSpaceGB, 2 )
            $snapshotSizeGB = [Math]::Round( $snapshotItem.SizeGB, 2 )
            $snapshotAgeDays = ((Get-Date) - $snapshotItem.Created).Days
    
            [PSCustomObject]@{
                "VM"                 = $vmItem
                "Name"               = $snapshotItem.Name
                "Description"        = $snapshotItem.Description
                "Created"            = $snapshotItem.Created
                "AgeDays"            = $snapshotAgeDays
                "ParentSnapshot"     = $snapshotItem.ParentSnapshot.Name
                "IsCurrentSnapshot"  = $snapshotItem.IsCurrent
                "SnapshotSizeGB"     = $snapshotSizeGB
                "ProvisionedSpaceGB" = $vmProvisionedSpaceGB
                "UsedSpaceGB"        = $vmUsedSpaceGB
                "PowerState"         = $snapshotItem.PowerState
            } # End PSCustomObject
        } # End foreach vmSnapshotList
    } # End foreach vmList
    
    Send-Mailmessage -smtpServer "Mailserver" -from "E-Mail Adresse" -to "E-Mail Adresse" -subject "Snapshot Report" -body $SnapShotList -bodyasHTML -priority High -encoding UTF8
    ... ungetestet ....


    Best regards,

    (79,108,97,102|%{[char]$_})-join''




    Donnerstag, 24. Mai 2018 09:11
  • Hallo,

    tut mir leid, dass ich das nicht formatiert habe, ich hatte dies in dem Moment einfach vergessen.

    Danke auf jeden Fall für die Hilfe, allerdings würde ich diese, wenn das Okay ist noch einmal beanspruchen wollen. 

    Und zwar habe ich zwei Dinge:

    Wenn ich das ganze in der Powershell "abschicken" möchte, kommt diese Meldung:

    Send-MailMessage : Cannot convert 'System.Object[]' to the type 'System.String' required by parameter 'Body'
    Specified method is not supported.
    At line:1 char:132
    + ... kauf@seca.com" -subject "Snapshot Report" -body $SnapShotList -bodyas ...
    +                                                     ~~~~~~~~~~~~~
        + CategoryInfo          : InvalidArgument: (:) [Send-MailMessage], ParameterBindingException
        + FullyQualifiedErrorId : CannotConvertArgument,Microsoft.PowerShell.Commands.SendMailMessage

    Da ich ein vollkommener neuling in Sachen Powershell bin, kann ich hiermit nicht so viel anfangen.

    Ich weiß nur, das etwas mit dem Body nicht stimmt, aber was, weiß ich nicht.

    Die 2. Sache ist ich brauche die Mail so, dass die Snapshots der Server nebeneinander stehen und nicht unter einander, aber auch hier weiß ich leider nicht wie dies geht. 

    Ich hoffe auch hier kann ich auf deine Hilfe zählen.

    Vielen Dank schon mal im voraus

    T.M.K

    Dienstag, 5. Juni 2018 08:46
  • Ah ... ok ...  laut Doku erwartet der Parameter -Body ein String-Element ... also wandeln wir einfach die Tabelle in einen String um ... so ungefähr:

    $body = $SnapShotList | Out-String

    .. achja, und -BodyAsHTML musst Du natürlich auch weglassen. Der "Body-String" enthält ja kein html. Es sei denn, Du wandelst die Tabelle in html um ... das geht auch ... so dann ...

    $body = $SnapShotList | ConvertTo-Html
    Zu Deiner zweiten Anforderung hab ich 'ne Meinung: Wenn es keinen technischen Grund gibt, warum die Liste anders formatiert sein soll, als sie von Powershell ausgegeben wird, ist die Antwort "Nein, warum?".  ;-) Ich bin meistens eher pragmatisch unterwegs. Wenn es ein großer Aufwand ist, ohne wirklich einen signifikanten Mehrwert zu liefern, dann verkneif ich mir die Mühe.



    Best regards,

    (79,108,97,102|%{[char]$_})-join''


    • Bearbeitet BOfH-666 Dienstag, 5. Juni 2018 11:23
    Dienstag, 5. Juni 2018 11:22
  • Hallo,

    vielen Dank für deine Hilfe! Du hast mir sehr weiter geholfen. 

    Die zweite Frage ist durch 

    $body = $SnapShotList | ConvertTo-Html | Out-String

    schon erledigt.

    Danke nochmal 

    T.M.K



    Dienstag, 5. Juni 2018 13:37