Dans mon précédent blog, je vous est montré comment on pouvait mettre en place la gestion d’erreur sur des commandes sous powershell qui ne sont pas des CMDLET, cette fois-ci nous allons voir comment appliquer la gestion d’erreur sur une CMDLET
PERIMETRE: Dans le cadre de l’amélioration des script powershell concernant la vérification des services après le redémarrage des serveurs en production chez un de nos client, celui-ci à laisser le soin au service architecture de trouver une solution.
Mon script d’origine:
######SERVEURS A REDEMARRER################
$Computerstring = "orches1"
$Computerdestination = $Computerstring.Split(",")
######SERVICES A ARRETER ET REDEMARRER################
$Servicesstring = "wudfsvc"
$Servicesname = $Servicesstring.Split(",")
######LOG CREER POUR LA VERIFICATION AVANT L'ARRET DES SERVICES SUR CHAQUES SERVEURS + GESTION ERREUR SUR SYNTAXE Command###
$StatusService = foreach ($vm in $Computerdestination){
get-Service -ComputerName $vm -name $Servicesname | select status,name,machinename }
#GESTION ERREUR DES SERVICES
$ExitCodeService = foreach ($SRVservices in $StatusService) {
if ($($SRVservices.status) -eq "Running"){
"Success : Service(s) Running" + $SRVservices
}else{
"Error : Service(s)" + $SRVservices
}
}
$ErrorStatusSVC = if ($StatusService -eq $null){
"Error : Service(s) "
}else{
"Success : Service(s)"
}
Voici le résultat pour les sortie erreurs:
$ExitCodeService
$ErrorStatusSVC
Vous voyez au dessus $ExitCodeService prend en compte que le service wudfsvc étant arrêté comme SUCCESS condition voulu ceci est normal et que $ErrorStatusSVC à été mise en place pour anticipé les erreurs $ExitCodeService si aucune valeur ne ressort ($ExitCodeService = VIDE) cela peut être une erreur de syntaxe, de service ou de serveurs inaccessible ou inexistant
Par contre aucune erreur détailler il faut effectuer une recherche supplémentaire.
Mon script amélioré:
######SERVEURS A REDEMARRER################
$Computerstring = "orches1"
$Computerdestination = $Computerstring.Split(",")
######SERVICES A ARRETER ET REDEMARRER################
$Servicesstring = "wudfsvc"
$Servicesname = $Servicesstring.Split(",")
######LOG CREER POUR LA VERIFICATION AVANT L'ARRET DES SERVICES SUR CHAQUES SERVEURS + GESTION ERREUR SUR SYNTAXE Command###
$StatusService =
Try {
foreach ($vm in $Computerdestination){
get-Service -ComputerName $vm -name $Servicesname -ErrorAction stop | select status,name,machinename
}
}catch{
"$vm => " + $Error[0]
}
#GESTION ERREUR DES SERVICES
$ExitCodeService = foreach ($SRVservices in $StatusService) {
if ($($SRVservices.status) -eq "stopped"){
"Success:" + $SRVservices
}else{
"Error:" + $SRVservices
}
}
Voici le résultat pour la sortie d’erreur:
La correction se base sur la gestion d’erreur avec les commandes Try et Catch
Dans la partie Try entre crochets, la commande get-service doit obligatoirement avoir l’option qui permet la sortie d’erreur qui se nomme –ErrorAction stop cela permettra d’avoir dans la partie catch les messages d’erreur le déroulement du processus $Error[0] .
Message des erreurs qui sont géré dans : $StatusService
Erreur sur le compte d’ordinateur inexistant ou inaccessible:
Erreur sur le service inexistant ou inaccessible:
Erreur sur la syntaxe commande get-service:
Les messages de sortie sont aussi retransmis dans la variable $ExitCodeService à l’aide des conditions if et else