Question Backup + Check return Code Robocopy + mail + ...
- Olivier
- Auteur du sujet
- Hors Ligne
- Membre elite
- Messages : 182
- Remerciements reçus 0
Voici comme promis mon code pour la sauvegarde de deux repertoires par le biais de deux commande \"Robocopy\" et le tout géré avec PowerShell
Si vous avez des commentaires et/ou améliorations, hésitez pas
[code:1]$SourceEee = 'D:\Eee'
$TargetEee = 'Z:\Backup\Eee'
$EeeLog = \"D:\Backup\Backup \"+\"Eee\"+\" {0:dddd dd MMM yyyy' - 'HH'h'mm}.log\" -f (Get-Date)
robocopy $SourceDoc $TargetEee /MIR /R:3 /W:2 > $EeeLog
$EeeExitCode = $LASTEXITCODE
$SourceAaa = 'D:\Aaa'
$TargetAaa = 'Z:\Backup\Aaa'
$AaaLog = \"D:\Backup\Backup \"+\"Aaa\"+\" {0:dddd dd MMM yyyy' - 'HH'h'mm}.log\" -f (Get-Date)
robocopy \"D:\Aaa\" \"Z:\Backup\Aaa\" /MIR /R:3 /W:2 > $AaaLog
$AaaExitCode = $LASTEXITCODE
$ExitCode = @{
\"16\"=\"Erreur fatale lors de l'opération. Voir fichier de Log\"
\"15\"=\"Echec de la copie. Voir le fichier de Log.\"
\"14\"=\"Echec de la copie. Voir le fichier de Log.\"
\"13\"=\"Echec de la copie. Voir le fichier de Log.\"
\"12\"=\"Echec de la copie. Voir le fichier de Log.\"
\"11\"=\"Echec de la copie. Voir le fichier de Log.\"
\"10\"=\"Echec de la copie. Voir le fichier de Log.\"
\"9\"=\"Echec de la copie. Voir le fichier de Log.\"
\"8\"=\"Echec de la copie. Plisieurs fichiers n'ont pas été copiés. Voir le fichier de Log.\"
\"7\"=\"Copie OK. Certains fichiers présents et supplémentaires on générés une incohérence entre la source et la destination. Voir le fichier de Log.\"
\"6\"=\"Copie OK. Certains fichiers et dossiers suplémentaires ont génété une incohérence entre la source et la destination. Voir le fichier de Log.\"
\"5\"=\"Copie OK. Certains fichiers ont été copiés et d'autres ont généré une incohérence entre la source et la destination. Voir le fichier de Log.\"
\"4\"=\"Copie OK. Une incohérence entre la source et la destination de la sauvegarde a été détectée. Voir le fichier de Log.\"
\"3\"=\"Copie OK. Certains fichiers supplémentaires ont été copiés avec succès.\"
\"2\"=\"Copie OK. Certains fichiers ou répertoires supplémentaires ont été détectés et copiés avec succès.\"
\"1\"=\"Copie OK. Un ou plusieurs fichiers ont été copiés avec succès du répertoire source au répertoire de destination.\"
\"0\"=\"Copie OK. Aucun changement. Le répertoire source était identique au répertoire de destination.\"
}
$Times = Get-date -Format 'dddd dd MMM yyyy'
$Hour = Get-Date -Format 'HH\"h\"mm'
$MailAaaKO = \"Echec de la sauvegarde \"\"Aaa\"\" du $Times. Succès de la sauvegarde \"\"Eee\"\" \"
$MailEeeKO = \"Echec de la sauvegarde \"\"Eee\"\" du $Times. Succès de la sauvegarde \"\"Aaa\"\" \"
$MailEeeAaaKO = \"Echec de la sauvegarde \"\"Eee\"\" et \"\"Aaa\"\" du $Times\"
$MailEeeAaaOK = \"Succès des sauvegardes \"\"Eee\"\" et \"\"Aaa\"\" du $Times\"
$mail = New-Object System.Net.Mail.MailMessage
if ($EeeExitCode -lt 4 -and $AaaExitCode -lt 4) # À partir du code \"4\" on envoie un message personnalisé avec la pièce jointe concernée
{
$mail.Body = \"Ceci est un message de confirmation du bon déroulement de la sauvegarde terminée le $Times à $Hour.`n`nLes résultats de sauvegardes ont été les suivants :`n`nAaa`n\"+$ExitCode[\"$AaaExitCode\"]+\" `n`nEee `n\"+$ExitCode[\"$EeeExitCode\"]
$mail.Subject = $MailEeeAaaOK
$mail.priority = 'Normal'
$mail.Attachments.Clear()
}
ElseIf ($EeeExitCode -lt 4 -and $AaaExitCode -gt 3)
{
$mail.Body = \"Ceci est un message d'alerte concernant un problème survenu lors de la sauvegarde \"\"Aaa\"\" du $Times à $Hour.`n`nLes résultats de sauvegardes ont été les suivants :`n`nAaa`n\"+$ExitCode[\"$AaaExitCode\"]+\" `n`nEee `n\"+$ExitCode[\"$EeeExitCode\"]+\"`n`
Pour de plus amples détails, consultez le fichier log en pièce jointe\"
$mail.Subject = $MailKO
$mail.priority = 'High'
$mail.Attachments.Add(\"$AaaLog\"«»)
}
ElseIf ($AaaExitCode -lt 4 -and $EeeExitCode -gt 3)
{
$mail.Body = \"Ceci est un message d'alerte concernant un problème survenu lors de la sauvegarde \"\"Eee\"\" du $Times à $Hour.`n`nLes résultats de sauvegardes ont été les suivants :`n`nAaa`n\"+$ExitCode[\"$AaaExitCode\"]+\" `n`nEee `n\"+$ExitCode[\"$EeeExitCode\"]+\"`n`
Pour de plus amples détails, consultez le fichier log en pièce jointe\"
$mail.Subject = $MailEeeKO
$mail.priority = 'High'
$mail.Attachments.Add(\"$EeeLog\"«»)
}
Else
{
$mail.Body = \"Ceci est un message d'alerte concernant un problème survenu lors des sauvegardes \"\"Aaa\"\" et \"\"Eee\"\" du $Times à $Hour. `n`nLes résultats de sauvegardes ont été les suivants :`n`nAaa`n\"+$ExitCode[\"$AaaExitCode\"]+\" `n`nEee `n\"+$ExitCode[\"$EeeExitCode\"]+\"`n`
Pour de plus amples détails, consultez les fichiers log en pièces jointe\"
$mail.Subject = $MailEeeAaaKO
$mail.priority = 'High'
$mail.Attachments.Add(\"$AaaLog\"«»)
$mail.Attachments.Add(\"$EeeLog\"«»)
}
$mail.From = 'Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.' # Adresse de l'envoyeur
$mail.To.Add('Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.') # Adresse du destinataire en À
$mail.CC.Add('Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.') # Adresse du destinataire en Cc
# $mail.Bcc.Add('Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.') # Adresse du destinataire en Cci
$smtpServer = 'serversmtp.Domain.TLD' # Adresse du serveur smtp
$smtpClient = new-object system.net.mail.SmtpClient($SmtpServer)
$smtpClient.Port = 587 # Spécification du port du serveur SMTP
$smtpClient.Credentials = New-Object System.Net.NetworkCredential('UserName <address e-mail>','Password')
$smtpClient.Send($mail) # Hop, on envoie le mail
$mail.Attachments.Dispose() # On \"libère\" la variable \"$mail.Attachments.Add(\"piècejointe\"«») autrement, prochain lancement, erreur 16, fichier déjà ouvert par un autre processus. Grand merci à Laurent Dardenne pour les explications trouvées sur son site !!
$mail = $null # On libère le contenu de la variable $mail
$smtpClient = $null # On libère le contenu de la variable $smtpClient
$EeeExitCode # Pour info et test, on affiche le contenu du CodeExit pour la première sauvegarde
$AaaExitCode # Pour info et test, on affiche le contenu du CodeExit pour la seconde sauvegarde[/code:1]
Un grand merci à Janel pour son aide et à Laurent Dardenne pour la supprême excellence de ces documentations chez Developpez.com !!
Au fait, j'ai bien regardé la nouvelle commande Send-MailMessage mais d'après ce que j'ai trouvé sur le net, elle ne permet pas l'envoi sur un port autre que 25 ... Dans mon cas il fallait utiliser le port 587 donc j'ai fais d'une autre façon ...
Au plaisir
Olivier D.
Virtual Business Card
Profile Linkedin <br><br>Message édité par: Olivier, à: 9/03/11 18:18
Connexion ou Créer un compte pour participer à la conversation.
- Jacques Barathon
- Hors Ligne
- Administrateur
- Messages : 576
- Remerciements reçus 0
Connexion ou Créer un compte pour participer à la conversation.
- Olivier
- Auteur du sujet
- Hors Ligne
- Membre elite
- Messages : 182
- Remerciements reçus 0
Voilà une nouvelle version améliorée avec l'astuce pour insérer des caractères accentué dans la description des adresse e-mail ...
De plus, étant que le job commence à 22h et qu'il fini peut-être plus tard que 00h00, j'ai fais en sotre que le titre du message s'adapte aà la date du démarrage du script et une autre variable est créée pour avoir la date et heure de la fin du script ...
Voilà le code complet :
[code:1]$TimesStart = Get-date -Format 'dddd dd MMM yyyy'
$HourStart = Get-Date -Format 'HH\"h\"mm'
$EeeLog = \"D:\Backup\Backup \"+\"Eee\"+\" {0:dddd dd MMM yyyy' - 'HH'h'mm}.log\" -f (Get-Date)
robocopy \"D:\Eee\" \"Z:\Backup\Eee\" /MIR /R:3 /W:2 > $EeeLog
$EeeExitCode = $LASTEXITCODE
$AaaLog = \"D:\Backup\Backup \"+\"Aaa\"+\" {0:dddd dd MMM yyyy' - 'HH'h'mm}.log\" -f (Get-Date)
robocopy \"D:\Aaa\" \"Z:\Backup\Aaa\" /MIR /R:3 /W:2 > $AaaLog
$AaaExitCode = $LASTEXITCODE
$TimesEnd = Get-date -Format 'dddd dd MMM yyyy'
$HourEnd = Get-Date -Format 'HH\"h\"mm'
$ExitCode = @{
\"16\"=\"Erreur fatale lors de l'opération. Voir fichier de Log\"
\"15\"=\"Echec de la copie. Voir le fichier de Log.\"
\"14\"=\"Echec de la copie. Voir le fichier de Log.\"
\"13\"=\"Echec de la copie. Voir le fichier de Log.\"
\"12\"=\"Echec de la copie. Voir le fichier de Log.\"
\"11\"=\"Echec de la copie. Voir le fichier de Log.\"
\"10\"=\"Echec de la copie. Voir le fichier de Log.\"
\"9\"=\"Echec de la copie. Voir le fichier de Log.\"
\"8\"=\"Echec de la copie. Plisieurs fichiers n'ont pas été copiés. Voir le fichier de Log.\"
\"7\"=\"Copie OK. Certains fichiers présents et supplémentaires on générés une incohérence entre la source et la destination. Voir le fichier de Log.\"
\"6\"=\"Copie OK. Certains fichiers et dossiers suplémentaires ont génété une incohérence entre la source et la destination. Voir le fichier de Log.\"
\"5\"=\"Copie OK. Certains fichiers ont été copiés et d'autres ont généré une incohérence entre la source et la destination. Voir le fichier de Log.\"
\"4\"=\"Copie OK. Une incohérence entre la source et la destination de la sauvegarde a été détectée. Voir le fichier de Log.\"
\"3\"=\"Copie OK. Certains fichiers supplémentaires ont été copiés avec succès.\"
\"2\"=\"Copie OK. Certains fichiers ou répertoires supplémentaires ont été détectés et copiés avec succès.\"
\"1\"=\"Copie OK. Un ou plusieurs fichiers ont été copiés avec succès du répertoire source au répertoire de destination.\"
\"0\"=\"Copie OK. Aucun changement. Le répertoire source était identique au répertoire de destination.\"
}
$TimesEnd = Get-date -Format 'dddd dd MMM yyyy'
$HourEnd = Get-Date -Format 'HH\"h\"mm'
$MailAaaKO = \"Echec de la sauvegarde \"\"Aaa\"\" du $TimesStart. Succès de la sauvegarde \"\"Eee\"\" \"
$MailEeeKO = \"Echec de la sauvegarde \"\"Eee\"\" du $TimesStart. Succès de la sauvegarde \"\"Aaa\"\" \"
$MailEeeAaaKO = \"Echec de la sauvegarde \"\"Eee\"\" et \"\"Aaa\"\" du $TimesStart\"
$MailEeeAaaOK = \"Succès de la sauvegarde \"\"Eee\"\" et \"\"Aaa\"\" du $TimesStart\"
$mail = New-Object System.Net.Mail.MailMessage
if ($EeeExitCode -lt 1 -and $AaaExitCode -lt 1)
{
$mail.Body = \"Ceci est un message de confirmation du bon déroulement des sauvegardes \"\"Aaa\"\" et \"\"Eee\"\" démarrées le $TimesStart à $HourStart et terminées le $TimesEnd à $HourEnd.`n`nLes résultats de sauvegardes ont été les suivants :`n`nAaa`n\"+$ExitCode[\"$AaaExitCode\"]+\" `n`nEee `n\"+$ExitCode[\"$EeeExitCode\"]
$mail.Subject = $MailEeeAaaOK
$mail.priority = 'Normal'
$mail.Attachments.Clear()
}
ElseIf ($EeeExitCode -lt 1 -and $AaaExitCode -gt 0)
{
$mail.Body = \"Ceci est un message d'alerte concernant un problème survenu lors de la sauvegarde \"\"Aaa\"\" démarrée le $TimesStart à $HourStart et terminée le $TimesEnd à $HourEnd.`n`nLes résultats de sauvegardes ont été les suivants :`n`nAaa`n\"+$ExitCode[\"$AaaExitCode\"]+\" `n`nEee `n\"+$ExitCode[\"$EeeExitCode\"]+\"`n`
Pour de plus amples détails, consultez le fichier log en pièce jointe\"
$mail.Subject = $MailAaaKO
$mail.priority = 'High'
$mail.Attachments.Add(\"$AaaLog\"«»)
}
ElseIf ($AaaExitCode -lt 1 -and $EeeExitCode -gt 0)
{
$mail.Body = \"Ceci est un message d'alerte concernant un problème survenu lors de la sauvegarde \"\"Eee\"\" démarrée le $TimesStart à $HourStart et terminée le $TimesEnd à $HourEnd.`n`nLes résultats de sauvegardes ont été les suivants :`n`nAaa`n\"+$ExitCode[\"$AaaExitCode\"]+\" `n`nEee `n\"+$ExitCode[\"$EeeExitCode\"]+\"`n`
Pour de plus amples détails, consultez le fichier log en pièce jointe\"
$mail.Subject = $MailEeeKO
$mail.priority = 'High'
$mail.Attachments.Add(\"$EeeLog\"«»)
}
Else
{
$mail.Body = \"Ceci est un message d'alerte concernant un problème survenu lors des sauvegardes \"\"Aaa\"\" et \"\"Eee\"\" démarrées le $TimesStart à $HourStart et terminées le $TimesEnd à $HourEnd. `n`nLes résultats de sauvegardes ont été les suivants :`n`nAaa`n\"+$ExitCode[\"$AaaExitCode\"]+\" `n`nEee `n\"+$ExitCode[\"$EeeExitCode\"]+\"`n`
Pour de plus amples détails, consultez les fichiers log en pièces jointe\"
$mail.Subject = $MailEeeAaaKO
$mail.priority = 'High'
$mail.Attachments.Add(\"$AaaLog\"«»)
$mail.Attachments.Add(\"$EeeLog\"«»)
}
$mail.From = 'Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.'
$mail.To.Add('Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.')
$mail.CC.Add('=?iso-8859-1?Q?D=E9D=E9_T=F4t=F4?= <UserMail@Domain.TLD>')
$mail.Bcc.Add('Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.')
$smtpServer = 'serversmtp.Domain.TLD'
$smtpClient = new-object system.net.mail.SmtpClient($SmtpServer)
$smtpClient.Port = 587
$smtpClient.Credentials = New-Object System.Net.NetworkCredential('UserName <address e-mail>','Password')
$smtpClient.Send($mail)
$mail.Attachments.Dispose()
$mail = $null
$smtpClient = $null
#$EeeExitCode
#$AaaExitCode[/code:1]
L'exemple des trois types de message potentiellement envoyé avec leur contenu :
Fichier renommé sur la sauvegarde \"Aaa\"
Ceci est un message de confirmation du bon déroulement des sauvegardes \"Aaa\" et \"Eee\" démarrées le vendredi 11 mars 2011 à 16h46 et terminées le vendredi 11 mars 2011 à 16h46.
Les résultats de sauvegardes ont été les suivants :
Aaa
Copie OK. Certains fichiers supplémentaires ont été copiés avec succès.
Eee
Copie OK. Aucun changement. Le répertoire source était identique au répertoire de destination.
Fichier supprimé sur la sauvegarde \"Aaa\"
Ceci est un message de confirmation du bon déroulement des sauvegardes \"Aaa\" et \"Eee\" démarrées le vendredi 11 mars 2011 à 16h48 et terminées le vendredi 11 mars 2011 à 16h48.
Les résultats de sauvegardes ont été les suivants :
Aaa
Copie OK. Certains fichiers ou répertoires supplémentaires ont été détectés et copiés avec succès.
Eee
Copie OK. Aucun changement. Le répertoire source était identique au répertoire de destination.
OK, les ExitCode de Robocopy demandent à être un peu mieux cohérents mais pas encore trouvé des références détaillées sur ces ExitCode ..
Ca sera fait lors de la prochaine mise à jour et pour autant que j'aie réussi à reproduire tous les codes par un exemple concret ... À venir ...
Pour ce qui est de l'affichage des destinataires dans le Client \"Outlook\" :
Envoyé : ven. 11.03.2011 16:49
À : Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.
Cc: Dédé TôTô
On remarque que les caractères accentués sont interprêtés sans problème ... Une autre solution existe certainement et si vous trouvez mieux, je prend
Si vous avez des suggestions et/ou améliorations, n'hésitez pas !!
Tout de bon et à +
Olivier D.
Virtual Business Card
Profile Linkedin <br><br>Message édité par: Olivier, à: 11/03/11 16:59
Connexion ou Créer un compte pour participer à la conversation.
- Olivier
- Auteur du sujet
- Hors Ligne
- Membre elite
- Messages : 182
- Remerciements reçus 0
16 = ***FATAL ERROR***
15 = OKCOPY + FAIL + MISMATCHES + XTRA
14 = FAIL + MISMATCHES + XTRA
13 = OKCOPY + FAIL + MISMATCHES
12 = FAIL + MISMATCHES& goto end
11 = OKCOPY + FAIL + XTRA
10 = FAIL + XTRA
9 = OKCOPY + FAIL
8 = FAIL
7 = OKCOPY + MISMATCHES + XTRA
6 = MISMATCHES + XTRA
5 = OKCOPY + MISMATCHES
4 = MISMATCHES
3 = OKCOPY + XTRA
2 = XTRA
1 = OKCOPY
0 = No Change
À traduire et interprêter ...
Chez Microsoft, on retrouve quelque codes mais pas tous ...
Tout de bon et à +
Olivier D.
Virtual Business Card
Profile Linkedin
Connexion ou Créer un compte pour participer à la conversation.
- Gabriel
- Hors Ligne
- Membre elite
- Messages : 248
- Remerciements reçus 1
mais preque rien a voir avec le schmillblick, je suis intrigué par [code:1]{0:dddd dd MMM yyyy' - 'HH'h'mm}.log\" -f (Get-Date)
[/code:1]
c'est fu formatage d'expression reguliere?
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
- Messages : 6302
- Remerciements reçus 68
Non, l'opérateur -F est mappé sur la méthode statique String.Format ( le lien MSDN contient la doc des 'indicateurs' de format).c'est fu formatage d'expression reguliere?
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Contributions à la communauté
- Backup + Check return Code Robocopy + mail + ...