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") } |
Laisser un commentaire ...