Question [Résolu] Script de Sauvegarde

Plus d'informations
il y a 8 ans 4 mois #24507 par Thomas
Bonjour,

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.

Plus d'informations
il y a 8 ans 4 mois #24510 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Script de Sauvegarde
Salut,
tu devrais déjà retirer le adresses email présent dans ton post.
Pour ceci
[code:1]
$contenu = @\&quot;

Sauvegarde du $TimesStart.
...

$contenu

\&quot;@
[/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 :

=&gt; = Erreur fatale lors de l'opération. Voir fichier de Log.

Peut être dois-tu construire un compte rendu utilisateur et un autre technique.
De référencer un fichier de log inconnu n'est pas d'un grand secours.

Naumisa écrit:

je trouve pour le moment mon script vachement mal écrit

Il est surtout difficile à relire :woohoo:

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.

Plus d'informations
il y a 8 ans 4 mois #24511 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Script de Sauvegarde
J'oubliais :

(dit pour que les lémuriens ne soient pas tentés d'en enlever)

Ceci n'a pas sa place dans un contexte pro ;) , à moins que tu veuilles te faire des ami(e)s...<br><br>Message édité par: Laurent Dardenne, à: 15/11/17 13:40

Tutoriels PowerShell

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

Plus d'informations
il y a 8 ans 4 mois #24512 par Thomas
Réponse de Thomas sur le sujet Re:Script de Sauvegarde
Laurent Dardenne écrit:

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 :

=&gt; = Erreur fatale lors de l'opération. Voir fichier de Log.

Peut être dois-tu construire un compte rendu utilisateur et un autre technique.
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 \&quot; Copie \&quot; dans la variable $contenu, car le 'return $contenu' dans la fonction \&quot; Copie \&quot; 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 \&quot; Page de codes active : 1252 \&quot; qui provient du \&quot; chcp 1252 \&quot;, 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.

Plus d'informations
il y a 8 ans 4 mois #24513 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Script de Sauvegarde
Dans ta fonction 'copie' tu émets le contenu d'une variable mais cette fonction renvoie également des informations du prg externe CHCP sur la sortie standard.
Ton retour de fonction renvoie donc 2 éléments et pas un seul comme tu t'y attends.

Essaie avec Chcp 1252 &gt; $null.

Tutoriels PowerShell

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

Plus d'informations
il y a 8 ans 4 mois #24514 par Thomas
Réponse de Thomas sur le sujet Re:Script de Sauvegarde
Cette erreur est corrigée comme ça, mais fais la même chose que si je ne mettais pas chcp 1252, car ceci est mis là afin d'avoir les accents dans le fichier .log...

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.

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