2016-10-14 1 views
0

J'ai reçu un script PowerShell pour signaler l'état de la sauvegarde SQL sur plusieurs serveurs, il fonctionne correctement, mais il n'a aucune fonction pour envoyer du courrier. J'ai ajouté cette partie et maintenant je suis en mesure d'obtenir le courrier avec la pièce jointe. La seule préoccupation est, je veux que le rapport montre "NA" et pas une date par défaut où la satabase est dans le modèle de récupération simple ou si la sauvegarde n'a pas eu lieu. Quelqu'un peut-il conseiller?État de la sauvegarde SQL Server Rapport avec PowerShell

Voici le code, juste au cas où quelqu'un a besoin contrairement à mon exigence:

$ServerList = Get-Content "Serverlist location" 
$OutputFile = "to save the report location" 

$titleDate = Get-Date -UFormat "%m-%d-%Y - %A" 
$HTML = '<style type="text/css"> 
    #Header{font-family:"Trebuchet MS", Arial, Helvetica, sans-serif;width:100%;border-collapse:collapse;} 
    #Header td, #Header th {font-size:14px;border:1px solid #98bf21;padding:3px 7px 2px 7px;} 
    #Header th {font-size:14px;text-align:left;padding-top:5px;padding-bottom:4px;background-color:#A7C942;color:#fff;} 
    #Header tr.alt td {color:#000;background-color:#EAF2D3;} 
    </Style>' 

$HTML += "<HTML><BODY><Table border=1 cellpadding=0 cellspacing=0 width=100% id=Header> 
     <TR> 
      <TH><B>Database Name</B></TH> 
      <TH><B>RecoveryModel</B></TD> 
      <TH><B>Last Full Backup Date</B></TH> 
      <TH><B>Last Differential Backup Date</B></TH> 
      <TH><B>Last Log Backup Date</B></TH> 
     </TR>" 

[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | Out-Null 
foreach ($ServerName in $ServerList) 
{ 
    $HTML += "<TR bgColor='#ccff66'><TD colspan=5 align=center><B>$ServerName</B></TD></TR>" 

    $SQLServer = New-Object ('Microsoft.SqlServer.Management.Smo.Server') $ServerName 
    foreach ($Database in $SQLServer.Databases) 
    { 
     $HTML += "<TR> 
        <TD>$($Database.Name)</TD> 
        <TD>$($Database.RecoveryModel)</TD> 
        <TD>$($Database.LastBackupDate)</TD> 
        <TD>$($Database.LastDifferentialBackupDate)</TD> 
        <TD>$($Database.LastLogBackupDate)</TD> 
       </TR>" 
    } 
} 

$HTML += "</Table></BODY></HTML>" 
$HTML | Out-File $OutputFile 

$emailFrom = "send email address" 
$emailTo = "recipient email address" 
$subject = "Xyz Report" 
$body = "your words " 
$smtpServer = "Smptp server" 
$filePath = "location of the file you want to attach" 

function sendEmail([string]$emailFrom, [string]$emailTo, [string]$subject,[string]$body,[string]$smtpServer,[string]$filePath) 
{ 
    $email = New-Object System.Net.Mail.MailMessage 
    $email.From = $emailFrom 
    $email.To.Add($emailTo) 
    $email.Subject = $subject 
    $email.Body = $body 
    $emailAttach = New-Object System.Net.Mail.Attachment $filePath 
    $email.Attachments.Add($emailAttach) 
    $smtp = New-Object Net.Mail.SmtpClient($smtpServer) 
    $smtp.Send($email) 
} 

sendEmail $emailFrom $emailTo $subject $body $smtpServer $filePath 

Répondre

0

Remplacer

<TD>$($Database.LastBackupDate)</TD> 

avec quelque chose comme

<TD>$(if ($Database.RecoveryModel -eq 'Simple' -or $Database.LastBackupDate -eq '01/01/0001 00:00:00') {'NA'} else {$Database.LastBackupDate})</TD> 

Faites la même chose pour LastDifferentialBackupDate et LastLogBackupDate.


Cela dit, je recommande fortement la recherche dans calculated properties, ConvertTo-Html et Send-MailMessage, ce qui vous permettra de simplifier considérablement votre code:

[Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | Out-Null 

$emailFrom = '[email protected]' 
$emailTo = '[email protected]' 
$subject = 'Xyz Report' 
$smtpServer = 'mail.example.com' 

$style = @' 
<style type="text/css"> 
... 
</style> 
'@ 

$msg = Get-Content 'C:\path\to\serverlist.txt' | 
     ForEach-Object {New-Object 'Microsoft.SqlServer.Management.Smo.Server' $_} | 
     Select-Object -Expand Databases | 
     Select-Object Name, RecoveryModel, 
      @{n='LastBackupDate';e={if ($_.RecoveryModel -eq 'Simple' -or $_.LastBackupDate -eq '01/01/0001 00:00:00') {'NA'} else {$_.LastBackupDate}}}, 
      @{n='LastDifferentialBackupDate';e={if ($_.RecoveryModel -eq 'Simple' -or $_.LastDifferentialBackupDate -eq '01/01/0001 00:00:00') {'NA'} else {$_.LastDifferentialBackupDate}}}, 
      @{n='LastLogBackupDate';e={if ($_.RecoveryModel -eq 'Simple' -or $_.LastLogBackupDate -eq '01/01/0001 00:00:00') {'NA'} else {$_.LastLogBackupDate}}} | 
     ConvertTo-Html -Head $style | Out-String 

Send-MailMessage -From $emailFrom -To $emailTo -Subject $subject -Body $msg -BodyAsHtml -SmtpServer $smtpServer 

See also.

+0

Impossible d'éditer mon message précédent, appuyez sur Entrée avant d'avoir terminé. De toute façon, j'ai été en mesure d'obtenir le résultat souhaité avec votre aide comme ceci: - $ (if ($ Database.LastBackupDate -eq '01/01/0001 00:00:00 ') {' NA '} autre {$ Database.LastBackupDate}) Votre code simple comparé au mien a été d'une grande aide. Va vérifier sur les liens. J'ai essayé d'exécuter votre code édité et j'obtiens l'erreur suivante: Impossible de convertir 'System.Object []' au type 'System.String' requis par le paramètre 'Body'. La méthode spécifiée n'est pas prise en charge. – Att

+0

Le paramètre '-Body' attend une chaîne, mais' ConvertTo-Html' produit une liste de chaînes, donc sa sortie doit être fusionnée en une seule chaîne. Voir la mise à jour –

+0

Merci Ansgar, appréciez vos conseils. – Att