Question
[Résolu] Script de Sauvegarde
- Thomas
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 7
- Remerciements reçus 0
Donc je suis depuis quelques temps en train de travailler sur la création d'un script de sauvegarde modulable par rapport à la source et à la destination qui sera exécuté en tâche planifiée sur des serveurs principalement.
Je dois utiliser l'outil robocopy afin de gérer cette copie et me servir d'un fichier en .ini afin de permettre aux utilisateurs de régler certains paramètres, comme les répertoires / fichiers à copier.
Pour le moment, mon script est plus ou moins fonctionnel, ne me reste que quelques soucis à régler et à l'optimiser, sauf que je ne sais pas trop dans quel sens, je trouve pour le moment mon script vachement mal écrit, j'en vient donc à votre aide, quels ajustements puis-je faire sur ce script et surtout, ce que je n'arrive pas encore à régler dans le mail qui y est envoyé :
[code:1]Sauvegarde du mercredi 15 nov. 2017.
La copie à débutée le mercredi 15 nov. 2017 à 11h15 et voici les résultats :
CETTE PARTIE --> Page de codes active : 1252 Fichier journal : C:\Users\tw18803\Desktop\Thomas\Projet PowerShell\backup15-11-17.log Fichier journal : C:\Users\tw18803\Desktop\Thomas\Projet PowerShell\backup15-11-17.log Fichier journal : C:\Users\tw18803\Desktop\Thomas\Projet PowerShell\backup15-11-17.log Fichier journal : C:\Users\tw18803\Desktop\Thomas\Projet PowerShell\backup15-11-17.log Fichier journal : C:\Users\tw18803\Desktop\Thomas\Projet PowerShell\backup15-11-17.log Fichier journal : C:\Users\tw18803\Desktop\Thomas\Projet PowerShell\backup15-11-17.log Fichier journal : C:\Users\tw18803\Desktop\Thomas\Projet PowerShell\backup15-11-17.log Fichier journal : C:\Users\tw18803\Desktop\Thomas\Projet PowerShell\backup15-11-17.log Fichier journal : C:\Users\tw18803\Desktop\Thomas\Projet PowerShell\backup15-11-17.log Fichier journal : C:\Users\tw18803\Desktop\Thomas\Projet PowerShell\backup15-11-17.log <-- CETTE PARTIE
C:\Users\tw18803\Desktop\Thomas\Projet PowerShell => = Erreur fatale lors de l'opération. Voir fichier de Log.
=> = Erreur fatale lors de l'opération. Voir fichier de Log.
=> = Erreur fatale lors de l'opération. Voir fichier de Log.
=> = Erreur fatale lors de l'opération. Voir fichier de Log.
=> = Erreur fatale lors de l'opération. Voir fichier de Log.
=> = Erreur fatale lors de l'opération. Voir fichier de Log.
=> = Erreur fatale lors de l'opération. Voir fichier de Log.
=> = Erreur fatale lors de l'opération. Voir fichier de Log.
=> = Erreur fatale lors de l'opération. Voir fichier de Log.
=> = Erreur fatale lors de l'opération. Voir fichier de Log.
La copie s'est terminée le mercredi 15 nov. 2017 à 11h15.
[/code:1]
Je n'arrive pas à éjecter cette partie qui provient de la console, ce qui est renvoyé par le robocopy...
Voici mon script et mon fichier ini :
[code:1]#********************************************************************************
#
# Nom du programme :
# Version : 0.6
# Ecrit part : Thomas WAGNER
# Date modif : 14/11/17
# Date creation : 04/10/17
#
# Descriptif : Envoi un mail indiquant le resultat de la sauvegarde
# Fichiers necessaires :
#
# Modifications v0.1 : Creation du Fichier avec Module d'envoi de Mail
# Modifications v0.2 : Modifications avec Ajout Module lecture du .ini
# Modifications v0.3 : Modifications avec Ajout Module Copie (log a finir)
# Modifications v0.4 : Mise en place d'un nombre minimum de recuperation du .ini
# Modifications v0.5 : Problème fichier .log corrige, inclusions à finir
# Modifications v0.6 : Inclusions terminées, mail à finir
#
#______________________________________________________________________________________
clear
function Get-IniContent # Fonction de recuperation des donnees dans le .ini
{
$FilePath = \"$path\param.ini\"
$ini = @{}
switch -regex -file $FilePath
{
\"^\[(.+)\]\" # Section
{
$section = $matches[1]
$ini[$section] = @{}
$CommentCount = 0
}
\"^(;.*)$\" # Comment
{
$value = $matches[1]
$CommentCount = $CommentCount + 1
$name = \"Comment\" + $CommentCount
$ini[$section][$name] = $value
}
\"(.+?)\s*=(.*)\" # Key
{
$name, $value = $matches[1..2]
$ini[$section][$name] = $value
}
}
return $ini
}
function Send-Mail($contenu) # Fonction d'envoi du Mail
{
$encoding=[System.Text.Encoding]::UTF8
$from = \"test-powershell@onf.fr\"
$to = \"$mel2\", \"$mel3\", \"$mel4\", \"$mel5\"
$smtp = \"smtp.onf.fr\"
$objet = \"Test\"
$contenu = @\"
Sauvegarde du $TimesStart.
La copie à débutée le $TimesStart à $HourStart et voici les résultats :
$contenu
La copie s'est terminée le $TimesEnd à $HourEnd.
\"@
$joint = \"$path\backup$Date_ajd.log\"
Send-MailMessage -From $from -To $to -Subject $objet -Body $contenu -SmtpServer $smtp -Attachments $joint -Encoding $encoding
}
function Copie
{
$num = 1
chcp 1252
$log = \"$path\backup$Date_ajd.log\"
robocopy \"$inclu1\" \"$dest1\" /MIR /Z /r:1 /w:1 /FFT /NP /XO /log:$log
$lastlog1 = $LASTEXITCODE
$contenu = Affiche_Erreur $lastlog1 $inclu1 $dest1
robocopy \"$inclu2\" \"$dest1\" /MIR /Z /r:1 /w:1 /FFT /NP /XO /log+:$log
$lastlog2 = $LASTEXITCODE
$contenu = Affiche_Erreur $lastlog2 $inclu2 $dest1
robocopy \"$inclu3\" \"$dest1\" /MIR /Z /r:1 /w:1 /FFT /NP /XO /log+:$log
$lastlog3 = $LASTEXITCODE
$contenu = Affiche_Erreur $lastlog3 $inclu3 $dest1
robocopy \"$inclu4\" \"$dest1\" /MIR /Z /r:1 /w:1 /FFT /NP /XO /log+:$log
$lastlog4 = $LASTEXITCODE
$contenu = Affiche_Erreur $lastlog4 $inclu4 $dest1
robocopy \"$inclu5\" \"$dest1\" /MIR /Z /r:1 /w:1 /FFT /NP /XO /log+:$log
$lastlog5 = $LASTEXITCODE
$contenu = Affiche_Erreur $lastlog5 $inclu5 $dest1
robocopy \"$inclu6\" \"$dest1\" /MIR /Z /r:1 /w:1 /FFT /NP /XO /log+:$log
$lastlog6 = $LASTEXITCODE
$contenu = Affiche_Erreur $lastlog6 $inclu6 $dest1
robocopy \"$inclu7\" \"$dest1\" /MIR /Z /r:1 /w:1 /FFT /NP /XO /log+:$log
$lastlog7 = $LASTEXITCODE
$contenu = Affiche_Erreur $lastlog7 $inclu7 $dest1
robocopy \"$inclu8\" \"$dest1\" /MIR /Z /r:1 /w:1 /FFT /NP /XO /log+:$log
$lastlog8 = $LASTEXITCODE
$contenu = Affiche_Erreur $lastlog8 $inclu8 $dest1
robocopy \"$inclu9\" \"$dest1\" /MIR /Z /r:1 /w:1 /FFT /NP /XO /log+:$log
$lastlog9 = $LASTEXITCODE
$contenu = Affiche_Erreur $lastlog9 $inclu9 $dest1
robocopy \"$inclu10\" \"$dest1\" /MIR /Z /r:1 /w:1 /FFT /NP /XO /log+:$log
$lastlog10 = $LASTEXITCODE
$contenu = Affiche_Erreur $lastlog10 $inclu10 $dest1
return $contenu
}
function Affiche_Erreur($lastlog, $source, $destination)
{
if ($lastlog -eq 16)
{
$contenu = @\"
$contenu
$source => $destination = Erreur fatale lors de l'opération. Voir fichier de Log.
\"@
}
elseif ($lastlog -eq 15)
{
$contenu = @\"
$contenu
$source => $destination = Echec de la copie. Voir le fichier de Log.
\"@
}
elseif ($lastlog -eq 14)
{
$contenu = @\"
$contenu
$source => $destination = Echec de la copie. Voir le fichier de Log.
\"@
}
elseif ($lastlog -eq 13)
{
$contenu = @\"
$contenu
$source => $destination = Echec de la copie. Voir le fichier de Log.
\"@
}
elseif ($lastlog -eq 12)
{
$contenu = @\"
$contenu
$source => $destination = Echec de la copie. Voir le fichier de Log.
\"@
}
elseif ($lastlog -eq 11)
{
$contenu = @\"
$contenu
$source => $destination = Echec de la copie. Voir le fichier de Log.
\"@
}
elseif ($lastlog -eq 10)
{
$contenu = @\"
$contenu
$source => $destination = Echec de la copie. Voir le fichier de Log.
\"@
}
elseif ($lastlog -eq 9)
{
$contenu = @\"
$contenu
$source => $destination = Echec de la copie. Voir le fichier de Log.
\"@
}
elseif ($lastlog -eq 8)
{
$contenu = @\"
$contenu
$source => $destination = Echec de la copie. Plusieurs fichiers n'ont pas été copiés. Voir le fichier de Log.
\"@
}
elseif ($lastlog -eq 7)
{
$contenu = @\"
$contenu
$source => $destination = 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.
\"@
}
elseif ($lastlog -eq 6)
{
$contenu = @\"
$contenu
$source => $destination = Copie OK. Certains fichiers et dossiers suplémentaires ont généré une incohérence entre la source et la destination. Voir le fichier de Log.
\"@
}
elseif ($lastlog -eq 5)
{
$contenu = @\"
$contenu
$source => $destination = 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.
\"@
}
elseif ($lastlog -eq 4)
{
$contenu = @\"
$contenu
$source => $destination = Copie OK. Une incohérence entre la source et la destination de la sauvegarde à été détectée. Voir le fichier de Log.
\"@
}
elseif ($lastlog -eq 3)
{
$contenu = @\"
$contenu
$source => $destination = Copie OK. Certains fichiers supplémentaires ont été copiés avec succès.
\"@
}
elseif ($lastlog -eq 2)
{
$contenu = @\"
$contenu
$source => $destination = Copie OK. Certains fichiers ou repertoires supplementaires ont ete detectes et copies avec succès.
\"@
}
elseif ($lastlog -eq 1)
{
$contenu = @\"
$contenu
$source => $destination = Copie OK. Un ou plusieurs fichiers ont été copiés avec succès du repertoire source au repertoire de destination.
\"@
}
elseif ($lastlog -eq 0)
{
$contenu = @\"
$contenu
$source => $destination = Copie OK. Aucun changement. Le repertoire source était identique au repertoire de destination.
\"@
}
return $contenu
}
# # Recuperation donnees du fichier .ini (partie mail)
$mel1 = $iniContent[\"mel\"][\"mel1\"]
$mel2 = $iniContent[\"mel\"][\"mel2\"]
$mel3 = $iniContent[\"mel\"][\"mel3\"]
$mel4 = $iniContent[\"mel\"][\"mel4\"]
$mel5 = $iniContent[\"mel\"][\"mel5\"]
# Recuperation donnees du fichier .ini (partie inclusion)
$inclu1 = $iniContent[\"inclu\"][\"inclu1\"]
$inclu2 = $iniContent[\"inclu\"][\"inclu2\"]
$inclu3 = $iniContent[\"inclu\"][\"inclu3\"]
$inclu4 = $iniContent[\"inclu\"][\"inclu4\"]
$inclu5 = $iniContent[\"inclu\"][\"inclu5\"]
$inclu6 = $iniContent[\"inclu\"][\"inclu6\"]
$inclu7 = $iniContent[\"inclu\"][\"inclu7\"]
$inclu8 = $iniContent[\"inclu\"][\"inclu8\"]
$inclu9 = $iniContent[\"inclu\"][\"inclu9\"]
$inclu10 = $iniContent[\"inclu\"][\"inclu10\"]
# Recuperation donnees du fichier .ini (partie destination)
$dest1 = $IniContent[\"dest\"][\"dest1\"]
$path = Get-Location
$iniContent = Get-IniContent
$Date_ajd = Get-Date -Format \"dd-MM-yy\"
$TimesStart = Get-Date -Format 'dddd dd MMM yyyy'
$HourStart = Get-Date -Format 'HH\"h\"mm'
$contenu = \" \"
$contenu = Copie
$TimesEnd = Get-date -Format 'dddd dd MMM yyyy'
$HourEnd = Get-Date -Format 'HH\"h\"mm'
$HourMailEnd = Get-Date -Format 'HH'
Send-Mail $contenu[/code:1]
[code:1]IL FAUT LAISSER LE NOMBRE DE POSSIBILITES TEL QUEL SINON LE PROGRAMME NE FONCTIONNERA PAS
(dit pour que les utilisateurs ne soient pas tentés d'en enlever)
[Mel]
mel1=mail@mail.fr
mel2=mail2@mail.fr
mel3=autre@mail.fr
mel4=autre2@mail.fr
mel5=autre3@mail.fr
[inclu]
inclu1=C:\Users\tw18803\Desktop\Thomas\Projet PowerShell
inclu2=
inclu3=
inclu4=
inclu5=
inclu6=
inclu7=
inclu8=
inclu9=
inclu10=
[dest]
dest1=D:[/code:1]
Je précise que je ne travaille pas à plein temps sur ce script, j'y travaille 1 semaine sur 2 (cours / entreprise {BTS SIO en Alternance à Strasbourg})
De plus, je ne savais pas trop vers où me diriger au début, ce qui ralentissait ma production...
Après, je sais que j'utilise certainement pas mal de manière de coder qui pourraient être largement simplifiées, mais j'ai préféré faire au mieux pour que le script fonctionne et ce, après avoir dû commencer le PowerShell sur ce script sans jamais y avoir touché auparavant ^-^
Voilà, vous remerciant par avance de votre aide sur ce script,
Cordialement,
Naumisa
Message édité par: Naumisa, à: 15/11/17 13:10
Message édité par: Naumisa, à: 15/11/17 13:43
Message édité par: Naumisa, à: 15/11/17 13:44
Message édité par: Naumisa, à: 15/11/17 13:58<br><br>Message édité par: Arnaud, à: 30/11/17 22:38
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
tu devrais déjà retirer le adresses email présent dans ton post.
Pour ceci
[code:1]
$contenu = @\"
Sauvegarde du $TimesStart.
...
$contenu
\"@
[/code:1]
Renomme le paramètre de fonction, la relecture n'est pas aisée.
Pour :
[code:1]
function Suject($x, $y, $z)
[/code:1]
Nomme correctement la fonction et utilises des noms de paramètre explicite.
Je ne suis pas allé plus loin car la gestion de $contenu, même si elle fonctionne, me rend confus :/.
En même temps la ligne que tu veux supprimer semble référencée par :
Peut être dois-tu construire un compte rendu utilisateur et un autre technique.=> = Erreur fatale lors de l'opération. Voir fichier de Log.
De référencer un fichier de log inconnu n'est pas d'un grand secours.
Naumisa écrit:
Il est surtout difficile à relireje trouve pour le moment mon script vachement mal écrit
Je ne répond pas à ta question pour le moment, car là il faut une séance de debug pour aller plus loin.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Ceci n'a pas sa place dans un contexte pro(dit pour que les lémuriens ne soient pas tentés d'en enlever)
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Thomas
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 7
- Remerciements reçus 0
Renomme le paramètre de fonction, la relecture n'est pas aisée.
Pour :
[code:1]
function Suject($x, $y, $z)
[/code:1]
Nomme correctement la fonction et utilises des noms de paramètre explicite.
Je ne suis pas allé plus loin car la gestion de $contenu, même si elle fonctionne, me rend confus :/.
Je l'ai renommée en Affiche_Erreur, qui rajoute à la variable $contenu le résultat de la copie en fonction du Code Erreur robocopy afin d'envoyer en mail à la fin le résultat total de la Sauvegarde.
En même temps la ligne que tu veux supprimer semble référencée par :
Peut être dois-tu construire un compte rendu utilisateur et un autre technique.=> = Erreur fatale lors de l'opération. Voir fichier de Log.
De référencer un fichier de log inconnu n'est pas d'un grand secours.
Du tout, la ligne que je souhaite supprimer est, selon moi mise dans le texte final pour la simple et bonne raison que je suis contraint de mettre la fonction totale \" Copie \" dans la variable $contenu, car le 'return $contenu' dans la fonction \" Copie \" ne renvoie finalement rien pour le reste du script...
De plus, le fichier Log est fourni dans le mail, il n'y en a qu'un pour les 10 robocopy lancés.
Par conséquent je me retrouve avec ce rajout en plus du \" Page de codes active : 1252 \" qui provient du \" chcp 1252 \", ce sont des valeurs ressorties de la console.<br><br>Message édité par: Naumisa, à: 15/11/17 14:01
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Ton retour de fonction renvoie donc 2 éléments et pas un seul comme tu t'y attends.
Essaie avec Chcp 1252 > $null.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Thomas
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 7
- Remerciements reçus 0
Mais il reste encore les sorties disant que robocopy a mis ce qu'il a fait dans le fichier .log à tel endroit.<br><br>Message édité par: Naumisa, à: 15/11/17 15:04
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- [Résolu] Script de Sauvegarde