• Administration Systèmes
  • Administration Réseaux
  • Administration Bases de Données

Aide Informatique N°1

  • Actualités
  • Cours
    • ASR
    • TSRIT
  • Entraide
  • Contact
  • Crédits photo

Powershell script 2 – recopie de fichiers vers un autre serveur

31/08/2016 · by Dehecq Olivier · Leave a Comment

Bonjour à tous,

Toujours dans l’optique de passer à tout powershell, je programme des scripts à destination des clients. Afin que ce ne soit pas juste une « perte de temps » (le fait de changer de langage ne peut pas être considéré en lui-même être une amélioration) j’ai rajouté quelques fonctionnalités qui me permettront à terme de crypter le script pour que le client ne bidouille plus directement dedans.

En attendant, je vous communique mon petit script qui vous rendra service j’espère.

Comme dans tout script, le minimum est de :

  • catcher les erreurs
  • permettre de l’utiliser en tache planifiée (ça c’est pour les clients et pour moi)
  • documenter !!!
  • ajouter les améliorations éventuelles (le jour ou un de vos collègue tombe dessus après que vous ayez été viré par exemple :D)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# (c) Olivier Dehecq - Aareon France - 2016
# ---------------------------------------------------------------------------------------------------------------------------------------------------
# prérequis : autoriser l'execution des scripts powershell : "Set-ExecutionPolicy RemoteSigned"
# ---------------------------------------------------------------------------------------------------------------------------------------------------
# on peut exécuter le script de plusieurs façons :
# - soit en l'executant depuis powershell
# - soit en faisant un clic-droit "exécuter avec powershell"
# - soit en exécutant la commande "powershell.exe monscript.ps1 nopause" (en tache planifiée par exemple)
#
# de plus, un fichier de log sera généré (il faut que l'arborescence D:\Scripts\Logs\ existe)
# et ça utilise aussi un fichier D:\Scripts\serveurs_tse_PROD.txt qui contient les adresses IP des serveurs TSE sur lesquels on va copier tout ça
# ---------------------------------------------------------------------------------------------------------------------------------------------------
# améliorations eventuelles :
# - catcher les erreurs d'arborescence et de fichiers (fichier log, txt contenant les adresses IP)
# - permettre une modification des paramètres avec un autre fichier (genre fichier ini avec arborecence source, arborescence de destination, chemin du log, chemin du txt)
# - si erreur de processus en cours d'utilisation, utilisation d'une invoke-command pour fermer les fichiers ouverts ? (avec un paramètre pour l'activer genre FORCECOPY)
# Prérequis pour invoke-command :
# - Autoriser l'administration à distance (par défaut sous WS2012+)
# - CMD : winrm qc
# - PowerShell : enable-psRemoting [-skipNetworkProfileCheck]
# -skipnetworkprofilecheck (WS2012+) : pour le faire aussi sur le profil réseau « Public »
# - une fois les amélorations faites, compiler le script en .exe
# ---------------------------------------------------------------------------------------------------------------------------------------------------
#
# en cas d'erreur, la commande suivante affiche la version 'lisible humainement' au lieu de la version détaillée technique
$ErrorActionPreference = "Stop"
# efface l'ecran, equivalent de CLS
clear-host
# affiche la date / heure de début du script dans le fichier de log + pas d'option -append donc crée (ou remplace) le fichier de log
get-date | Out-File -FilePath D:\Scripts\Logs\copie_tse_prod.log
# creation de la variable $pause qui indique si on veut les pauses ou non, pour exécuter le programme à la main
$pause="YES"
# si on rajoute l'argument nopause apres le nom du script, enleve les pause (pour le passer en script de tache planifiée)
foreach($argument in $args) {
if($argument -eq "nopause") {
# dans se cas on définit la valeur de la variable $pause à NO
$pause = "NO"}
}
# write-host affiche à l'écran mais ne peut pas être redirigé vers un fichier de log, donc juste une information à l'écran
write-host " *****************************************************************************"
write-host " ** Script de recopie des exe de PROD vers D:\Scripts\serveurs_tse_prod.txt **"
write-host " *****************************************************************************"
write-host ""
write-host "Notas : "
write-host " - les serveurs sélectionnés sont ceux dont l'adresse IP est présente dans le fichier D:\Scripts\serveurs_tse_PROD.txt"
write-host " - En cas d'erreur L'accès au chemin d'accès 'Techwin' est refusé. vérifiez que le script est exécuté avec un compte pouvant se connecter au(x) serveur(s)"
write-host " - En cas d'erreur Le processus ne peut pas accéder au fichier '\\xxx\C$\APPLIx\EXE\xxxxx.exe', car il est en cours d'utilisation par un autre processus. fermez le(s) processus xxxxxx.exe sur le(s) serveur(s)"
write-host " *****************************************************************************"
# si on n'a pas ajouté l'argument nopause à la commande, ça affiche un texte et une pause (ici $x indique qu'on a pressé une touche)
if($pause -eq "YES") {
Write-Host " Press any key to continue ..." -ForegroundColor yellow
$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
}
# on va lister les adresses IP des serveurs présents dans le fichier txt et faire une boucle qui s'exécute pour chaque occurence d'adresse IP
forEach ($ServeurRds in get-content D:\Scripts\serveurs_tse_PROD.txt)
{
# affiche à l'écran mais impossible à rediriger ...
write-host "******************************* $ServeurRds *******************************"
# ... du coup echo puis | out-file avec option -append pour logger la ligne (astuce : j'ai rajouté "INFO :" pour ajouter de la lisibilité
echo "INFO : ******************************* $ServeurRds *******************************" | Out-File -Append -FilePath D:\Scripts\Logs\copie_tse_PROD.log
Write-Host "Test de la réponse du serveur $ServeurRds (...)"
echo "INFO : Test de la réponse du serveur $ServeurRds (...)" | Out-File -Append -FilePath D:\Scripts\Logs\copie_tse_PROD.log
# test-connexion est un équivalent de ping, mais avec l'option -count 1 -quiet ça renvoit TRUE ou FALSE selon si le ping aboutit ou non
if (test-connection $ServeurRds -count 1 -quiet)
# si la valeur renvoyée de test-connexion est TRUE
{
write-host " --> OK" -ForegroundColor green
echo "INFO : --> OK" | Out-File -Append -FilePath D:\Scripts\Logs\copie_tse_PROD.log
# copie des fichiers du répertoire CGWIN vers le chemin (contenant l'adresse IP du serveur
write-host "Copie des fichiers de CGWIN de PROD vers $ServeurRds (...)"
echo "INFO : Copie des fichiers de CGWIN de PROD vers $ServeurRds (...)" | Out-File -Append -FilePath D:\Scripts\Logs\copie_tse_PROD.log
# on va catcher les erreurs de copie qui pourraient arriver donc il faut faire un try de cette commande
try {
copy-item D:\SOURCES\APPLI1\EXE -destination \\$ServeurRds\C$\APPLI1\EXE -recurse -force
write-host " --> OK" -ForegroundColor green
echo "INFO : --> OK" | Out-File -Append -FilePath D:\Scripts\Logs\copie_tse_PROD.log}
# du coup si il y a une erreur, on l'affiche en rouge et on la logge (2 lignes car write-host ne peut pas etre redirigé vers un fichier)
catch {
write-host $error[0].exception.message -ForegroundColor red
echo "ERROR : $error[0].exception.message" | Out-File -Append -FilePath D:\Scripts\Logs\copie_tse_PROD.log }
# même chose avec les fichiers du répertoire CGWIN
write-host "Copie des fichiers de HLMWIN de PROD vers $ServeurRds (...)"
echo "INFO : Copie des fichiers de HLMWIN de PROD vers $ServeurRds (...)" | Out-File -Append -FilePath D:\Scripts\Logs\copie_tse_PROD.log
try {
copy-item D:\SOURCES\APPLI2\EXE -destination \\$ServeurRds\C$\APPLI2\EXE -recurse -force
write-host " --> OK" -ForegroundColor green
echo "INFO : --> OK" | Out-File -Append -FilePath D:\Scripts\Logs\copie_tse_PROD.log}
catch {
write-host $error[0].exception.message -ForegroundColor red
echo "ERROR : $error[0].exception.message" | Out-File -Append -FilePath D:\Scripts\Logs\copie_tse_PROD.log }
# et même chose avec les fichiers du répertoire TECHWIN
write-host "Copie des fichiers de TECHWIN de PROD vers $ServeurRds (...)"
echo "INFO : Copie des fichiers de TECHWIN de PROD vers $ServeurRds (...)" | Out-File -Append -FilePath D:\Scripts\Logs\copie_tse_PROD.log
try {
copy-item D:\SOURCES\APPLI3\EXE -destination \\$ServeurRds\C$\APPLI3\EXE -recurse -force
write-host " --> OK" -ForegroundColor green
echo "INFO : --> OK" | Out-File -Append -FilePath D:\Scripts\Logs\copie_tse_PROD.log }
catch {
write-host $error[0].exception.message -ForegroundColor red
echo "ERROR : $error[0].exception.message" | Out-File -Append -FilePath D:\Scripts\Logs\copie_tse_PROD.log }
# fin de la boucle de copie pour les test-connexion OK
}
else
# si la valeur renvoyée de test-connexion est FALSE
{
write-host " --> Serveur $ServeurRds pas allumé ou pas joignable par PING." -ForegroundColor red
echo "WARN : --> Serveur $ServeurRds pas allumé ou pas joignable par PING." | Out-File -Append -FilePath D:\Scripts\Logs\copie_tse_PROD.log
echo "WARN : Arret de la copie sur $ServeurRds - Aucune copie effectuée sur $ServeurRds"
}
# fin de la boucle, donc on retourne au début tant qu'il y a des valeurs dans le fichier texte
}
# on sort de la boucle donc on arrive à la fin du script
write-host "******************************* Fin du script *******************************"
echo "INFO : ******************************* Fin du script *******************************"| Out-File -Append -FilePath D:\Scripts\Logs\copie_tse_PROD.log
# affiche la date / heure de fin du script dans le fichier de log
get-date | Out-File -Append -FilePath D:\Scripts\Logs\copie_tse_PROD.log
# si on n'a pas ajouté l'argument nopause à la commande, ça affiche un texte et une pause (/!\ ici $y car $x est deja définit donc ça ne ferait plus de pause)
if($pause -eq "YES") {
Write-Host " Press any key to continue ..." -ForegroundColor yellow
$y = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
}
  • delicious Bookmark on Delicious
  • digg Digg this post
  • facebook Recommend on Facebook
  • reddit share via Reddit
  • stumble Share with Stumblers
  • twitter Tweet about it
  • rss Subscribe to the comments on this post

Partager :

  • Cliquez pour partager sur Facebook(ouvre dans une nouvelle fenêtre)
  • Cliquez pour partager sur Twitter(ouvre dans une nouvelle fenêtre)
  • Cliquez pour partager sur LinkedIn(ouvre dans une nouvelle fenêtre)
  • Cliquer pour imprimer(ouvre dans une nouvelle fenêtre)

Filed Under: Administration Systèmes, Entraide · Tagged: poweshell

Laisser un commentaire ...

Veuillez Connexion pour commenter
  Subscribe  
Notify of

Copyright © 2019 Olivier Dehecq

  • follow:follow:
  • RSS RSS
wpDiscuz