Question [Concours Scripting] get-status (pings) (Validé !)

Plus d'informations
il y a 16 ans 6 mois #969 par Jacques Barathon
Pour mon 100e post sur ce forum, je fais un peu plus lourd que d'habitude :)

Voici un script qui prend une liste d'ordinateurs en entrée et qui affiche leur statut réseau (résultat d'un ping) en boucle.

[code:1]
# get-status.ps1
#
# Auteur: janel
# Date: 19/09/2007
#
# Affiche une liste d'ordinateurs avec leur adresse IP et leur statut réseau.
# La liste est rafraichie à un intervalle déterminé par l'utilisateur.
#
# Syntaxe:
#
# get-status [-computerlist] <liste d'ordinateurs> [[-interval] <intervalle en secondes>]
#
# Le paramètre interval a une valeur de 10 secondes par défaut.
# Un appui sur CTRL+C interrompt le script (pris en compte après l'affichage des serveurs).
# Un appui sur n'importe quelle autre touche abrège immédiatement l'attente.
#
# Exemples:
#
# get-status server01,server02,server03 -interval 30
#
# ... affiche toutes les 30 secondes le statut pour server01, server02 et server03.
#
# get-status (get-content serveurs.txt)
#
# ... affiche toutes les 10 secondes le statut pour les serveurs contenus dans serveurs.txt.
#

param ($computerlist, [int]$interval = 10)

# créer un tableau de correspondance entre les valeurs de retour et leur signification :
# (source: msdn2.microsoft.com/fr-fr/library/aa394350.aspx)
$pingstatusref = @{}
$pingstatusref[0] = \"Success\"
$pingstatusref[11001] = \"Buffer Too Small\"
$pingstatusref[11002] = \"Destination Net Unreachable\"
$pingstatusref[11003] = \"Destination Host Unreachable\"
$pingstatusref[11004] = \"Destination Protocol Unreachable\"
$pingstatusref[11005] = \"Destination Port Unreachable\"
$pingstatusref[11006] = \"No Resources\"
$pingstatusref[11007] = \"Bad Option\"
$pingstatusref[11008] = \"Hardware Error\"
$pingstatusref[11009] = \"Packet Too Big\"
$pingstatusref[11010] = \"Request Timed Out\"
$pingstatusref[11011] = \"Bad Request\"
$pingstatusref[11012] = \"Bad Route\"
$pingstatusref[11013] = \"TimeToLive Expired Transit\"
$pingstatusref[11014] = \"TimeToLive Expired Reassembly\"
$pingstatusref[11015] = \"Parameter Problem\"
$pingstatusref[11016] = \"Source Quench\"
$pingstatusref[11017] = \"Option Too Big\"
$pingstatusref[11018] = \"Bad Destination\"
$pingstatusref[11032] = \"Negotiating IPSEC\"
$pingstatusref[11050] = \"General Failure\"

# se préparer à intercepter CTRL+C :
[System.Console]::TreatControlCAsInput = $true

# mémoriser la position de départ pour l'affichage du statut :
$startposition = $host.UI.RawUI.CursorPosition

while ($true)
{
# effacer les lignes :
$host.UI.RawUI.CursorPosition = $startposition
\" \" * $host.UI.RawUI.WindowSize.Width * $computerlist.Length

# revenir à la position de départ :
$host.UI.RawUI.CursorPosition = $startposition

# parcourir la liste des ordinateurs :
$computerlist | foreach `
{
# \"pinger\" l'ordinateur :
$pingstatus = get-wmiobject Win32_PingStatus -filter (\"Address='\" + $_ + \"'\"«»)

# afficher le nom et l'adresse IP de l'ordinateur :
write-host $pingstatus.Address.PadRight(16,\" \"«») -nonewline
write-host $pingstatus.ProtocolAddress.PadRight(16,\" \"«») -nonewline

# déterminer le texte à afficher pour le statut :
$statustext = $pingstatusref[[int]$pingstatus.StatusCode]
(!$pingstatus.ProtocolAddress) -and ($statustext = \"Request could not find host\"«») > $null

# déterminer la couleur d'affichage pour le statut (vert si 0, rouge sinon) :
$statuscolor = \"green\"
($pingstatus.StatusCode -or !$pingstatus.ProtocolAddress) -and ($statuscolor = \"red\"«») > $null

# afficher le statut :
write-host $statustext -foreground $statuscolor
} # fin du foreach

# attendre l'intervalle demandé :
$endtime = (get-date).AddSeconds($interval)
while ((get-date) -le $endtime)
{
# lire les entrées clavier :
if ([System.Console]::KeyAvailable)
{
$key = [System.Console]::ReadKey($true)

# intercepter CTRL+C :
if (($key.Modifiers -band [System.ConsoleModifiers]\"control\"«») -and ($key.Key -eq \"C\"«»))
{
# effacer les lignes :
$host.UI.RawUI.CursorPosition = $startposition
\" \" * $host.UI.RawUI.WindowSize.Width * $computerlist.Length

# revenir à la position de départ :
$host.UI.RawUI.CursorPosition = $startposition

# interrompre le script :
exit
} # fin du if (($key.Modifiers ...

# si autre touche, abréger l'attente :
else
{
break
} # fin du else
} # fin du if ([System.Console]::KeyAvailable)
} # fin du while ((get-date) -le $endtime)
} # fin du while ($true)[/code:1]
Les commentaires inclus devraient être assez clairs, mais n'hésitez pas si vous avez des questions!

Bonne fin de journée,
Janel

Message édité par: janel, à: 19/09/07 16:56

Message édité par: janel, à: 19/09/07 16:58<br><br>Message édité par: Arnaud, à: 24/09/07 23:10

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

Plus d'informations
il y a 16 ans 6 mois #971 par Jacques Barathon
Pour celles et ceux qui se demanderaient pourquoi je n'ai pas mis un simple start-sleep pour la gestion de l'attente en fin d'affichage, la raison est que je voulais pouvoir offrir deux fonctionnalités qui n'auraient pas été possibles avec start-sleep:

1. Interrompre le script avant la fin de l'intervalle - attendre quelques secondes peut être ok, mais si l'intervalle est réglé à 10, 20 ou 30 secondes (voire plus), ça peut devenir pénible.

2. Permettre l'appui sur une touche pour écourter l'attente - utile si on note qu'un serveur vient de changer de statut et qu'on veut rafraîchir plus rapidement pour suivre ce qui lui arrive.

Janel

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

Plus d'informations
il y a 16 ans 6 mois #993 par Arnaud Petitjean
C'est du lourd, du très lourd même !

Janel a envie de mériter son ouvrage, surtout qu'il lui reste encore beaucoup de choses à (nous ?) apprendre... :laugh:

Et trois points de plus pour ce 100ème post !

Arnaud

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

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

Plus d'informations
il y a 16 ans 6 mois #996 par Robin Lemesle
Bravo pour ce script de grande technicité :P

Tu mérites bien tes 3 points.

Rob

Robin MVP PowerShell

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

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