Question Backup + Check return Code Robocopy + mail + ...

Plus d'informations
il y a 10 ans 3 mois #9126 par Olivier
Bonjour à tous !!

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.

Plus d'informations
il y a 10 ans 3 mois #9127 par Jacques Barathon
Merci à toi Olivier de partager l'ensemble de ton script. Je suis sûr qu'il sera utile à d'autres administrateurs, tel quel ou comme source d'inspiration pour des besoins similaires.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 10 ans 3 mois #9156 par Olivier
re ;-)

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\&quot;h\&quot;mm'

$EeeLog = \&quot;D:\Backup\Backup \&quot;+\&quot;Eee\&quot;+\&quot; {0:dddd dd MMM yyyy' - 'HH'h'mm}.log\&quot; -f (Get-Date)
robocopy \&quot;D:\Eee\&quot; \&quot;Z:\Backup\Eee\&quot; /MIR /R:3 /W:2 &gt; $EeeLog
$EeeExitCode = $LASTEXITCODE

$AaaLog = \&quot;D:\Backup\Backup \&quot;+\&quot;Aaa\&quot;+\&quot; {0:dddd dd MMM yyyy' - 'HH'h'mm}.log\&quot; -f (Get-Date)
robocopy \&quot;D:\Aaa\&quot; \&quot;Z:\Backup\Aaa\&quot; /MIR /R:3 /W:2 &gt; $AaaLog
$AaaExitCode = $LASTEXITCODE

$TimesEnd = Get-date -Format 'dddd dd MMM yyyy'
$HourEnd = Get-Date -Format 'HH\&quot;h\&quot;mm'

$ExitCode = @{
\&quot;16\&quot;=\&quot;Erreur fatale lors de l'opération. Voir fichier de Log\&quot;
\&quot;15\&quot;=\&quot;Echec de la copie. Voir le fichier de Log.\&quot;
\&quot;14\&quot;=\&quot;Echec de la copie. Voir le fichier de Log.\&quot;
\&quot;13\&quot;=\&quot;Echec de la copie. Voir le fichier de Log.\&quot;
\&quot;12\&quot;=\&quot;Echec de la copie. Voir le fichier de Log.\&quot;
\&quot;11\&quot;=\&quot;Echec de la copie. Voir le fichier de Log.\&quot;
\&quot;10\&quot;=\&quot;Echec de la copie. Voir le fichier de Log.\&quot;
\&quot;9\&quot;=\&quot;Echec de la copie. Voir le fichier de Log.\&quot;
\&quot;8\&quot;=\&quot;Echec de la copie. Plisieurs fichiers n'ont pas été copiés. Voir le fichier de Log.\&quot;
\&quot;7\&quot;=\&quot;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.\&quot;
\&quot;6\&quot;=\&quot;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.\&quot;
\&quot;5\&quot;=\&quot;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.\&quot;
\&quot;4\&quot;=\&quot;Copie OK. Une incohérence entre la source et la destination de la sauvegarde a été détectée. Voir le fichier de Log.\&quot;
\&quot;3\&quot;=\&quot;Copie OK. Certains fichiers supplémentaires ont été copiés avec succès.\&quot;
\&quot;2\&quot;=\&quot;Copie OK. Certains fichiers ou répertoires supplémentaires ont été détectés et copiés avec succès.\&quot;
\&quot;1\&quot;=\&quot;Copie OK. Un ou plusieurs fichiers ont été copiés avec succès du répertoire source au répertoire de destination.\&quot;
\&quot;0\&quot;=\&quot;Copie OK. Aucun changement. Le répertoire source était identique au répertoire de destination.\&quot;
}

$TimesEnd = Get-date -Format 'dddd dd MMM yyyy'
$HourEnd = Get-Date -Format 'HH\&quot;h\&quot;mm'

$MailAaaKO = \&quot;Echec de la sauvegarde \&quot;\&quot;Aaa\&quot;\&quot; du $TimesStart. Succès de la sauvegarde \&quot;\&quot;Eee\&quot;\&quot; \&quot;
$MailEeeKO = \&quot;Echec de la sauvegarde \&quot;\&quot;Eee\&quot;\&quot; du $TimesStart. Succès de la sauvegarde \&quot;\&quot;Aaa\&quot;\&quot; \&quot;
$MailEeeAaaKO = \&quot;Echec de la sauvegarde \&quot;\&quot;Eee\&quot;\&quot; et \&quot;\&quot;Aaa\&quot;\&quot; du $TimesStart\&quot;
$MailEeeAaaOK = \&quot;Succès de la sauvegarde \&quot;\&quot;Eee\&quot;\&quot; et \&quot;\&quot;Aaa\&quot;\&quot; du $TimesStart\&quot;


$mail = New-Object System.Net.Mail.MailMessage

if ($EeeExitCode -lt 1 -and $AaaExitCode -lt 1)
{
$mail.Body = \&quot;Ceci est un message de confirmation du bon déroulement des sauvegardes \&quot;\&quot;Aaa\&quot;\&quot; et \&quot;\&quot;Eee\&quot;\&quot; 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\&quot;+$ExitCode[\&quot;$AaaExitCode\&quot;]+\&quot; `n`nEee `n\&quot;+$ExitCode[\&quot;$EeeExitCode\&quot;]
$mail.Subject = $MailEeeAaaOK
$mail.priority = 'Normal'
$mail.Attachments.Clear()
}

ElseIf ($EeeExitCode -lt 1 -and $AaaExitCode -gt 0)
{
$mail.Body = \&quot;Ceci est un message d'alerte concernant un problème survenu lors de la sauvegarde \&quot;\&quot;Aaa\&quot;\&quot; 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\&quot;+$ExitCode[\&quot;$AaaExitCode\&quot;]+\&quot; `n`nEee `n\&quot;+$ExitCode[\&quot;$EeeExitCode\&quot;]+\&quot;`n`
Pour de plus amples détails, consultez le fichier log en pièce jointe\&quot;
$mail.Subject = $MailAaaKO
$mail.priority = 'High'
$mail.Attachments.Add(\&quot;$AaaLog\&quot;«»)
}

ElseIf ($AaaExitCode -lt 1 -and $EeeExitCode -gt 0)
{
$mail.Body = \&quot;Ceci est un message d'alerte concernant un problème survenu lors de la sauvegarde \&quot;\&quot;Eee\&quot;\&quot; 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\&quot;+$ExitCode[\&quot;$AaaExitCode\&quot;]+\&quot; `n`nEee `n\&quot;+$ExitCode[\&quot;$EeeExitCode\&quot;]+\&quot;`n`
Pour de plus amples détails, consultez le fichier log en pièce jointe\&quot;
$mail.Subject = $MailEeeKO
$mail.priority = 'High'
$mail.Attachments.Add(\&quot;$EeeLog\&quot;«»)
}

Else
{
$mail.Body = \&quot;Ceci est un message d'alerte concernant un problème survenu lors des sauvegardes \&quot;\&quot;Aaa\&quot;\&quot; et \&quot;\&quot;Eee\&quot;\&quot; 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\&quot;+$ExitCode[\&quot;$AaaExitCode\&quot;]+\&quot; `n`nEee `n\&quot;+$ExitCode[\&quot;$EeeExitCode\&quot;]+\&quot;`n`
Pour de plus amples détails, consultez les fichiers log en pièces jointe\&quot;
$mail.Subject = $MailEeeAaaKO
$mail.priority = 'High'
$mail.Attachments.Add(\&quot;$AaaLog\&quot;«»)
$mail.Attachments.Add(\&quot;$EeeLog\&quot;«»)
}

$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?= &lt;UserMail@Domain.TLD&gt;')
$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 &lt;address e-mail&gt;','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 \&quot;Aaa\&quot;

Ceci est un message de confirmation du bon déroulement des sauvegardes \&quot;Aaa\&quot; et \&quot;Eee\&quot; 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 \&quot;Aaa\&quot;

Ceci est un message de confirmation du bon déroulement des sauvegardes \&quot;Aaa\&quot; et \&quot;Eee\&quot; 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 \&quot;Outlook\&quot; :

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.

Plus d'informations
il y a 10 ans 3 mois #9158 par Olivier
Concernant les ExitCode, voilà tout ce que j'ai trouvé comme description qui comprend TOUS les codes ...

16 = ***FATAL ERROR***
15 = OKCOPY + FAIL + MISMATCHES + XTRA
14 = FAIL + MISMATCHES + XTRA
13 = OKCOPY + FAIL + MISMATCHES
12 = FAIL + MISMATCHES&amp; 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.

Plus d'informations
il y a 9 ans 9 mois #10087 par Guardiola gabriel
Merci pour le script :-)

mais preque rien a voir avec le schmillblick, je suis intrigué par [code:1]{0:dddd dd MMM yyyy' - 'HH'h'mm}.log\&quot; -f (Get-Date)
[/code:1]

c'est fu formatage d'expression reguliere?

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 9 ans 9 mois #10089 par Laurent Dardenne
tonic8 écrit:

c'est fu formatage d'expression reguliere?

Non, l'opérateur -F est mappé sur la méthode statique String.Format ( le lien MSDN contient la doc des 'indicateurs' de format).

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.100 secondes
Propulsé par Kunena