Question [Concours Scripting] get-status (pings) (Validé !)
- Jacques Barathon
- Auteur du sujet
- Hors Ligne
- Administrateur
Réduire
Plus d'informations
- Messages : 576
- Remerciements reçus 0
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
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.
- Jacques Barathon
- Auteur du sujet
- Hors Ligne
- Administrateur
Réduire
Plus d'informations
- Messages : 576
- Remerciements reçus 0
il y a 16 ans 6 mois #971
par Jacques Barathon
Réponse de Jacques Barathon sur le sujet Re:[Concours Scripting] get-status (ping répété)
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
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.
- Arnaud Petitjean
- Hors Ligne
- Modérateur
il y a 16 ans 6 mois #993
par Arnaud Petitjean
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 ?
Réponse de Arnaud Petitjean sur le sujet Re:[Concours Scripting] get-status (ping répété)
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...
Et trois points de plus pour ce 100ème post !
Arnaud
Janel a envie de mériter son ouvrage, surtout qu'il lui reste encore beaucoup de choses à (nous ?) apprendre...
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.
- Robin Lemesle
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 260
- Remerciements reçus 0
il y a 16 ans 6 mois #996
par Robin Lemesle
Robin MVP PowerShell
Réponse de Robin Lemesle sur le sujet Re:[Concours Scripting] get-status (ping répété)
Bravo pour ce script de grande technicité
Tu mérites bien tes 3 points.
Rob
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
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Contributions à la communauté
- [Concours Scripting] get-status (pings) (Validé !)