Question Ne pas afficher les erreurs

Plus d'informations
il y a 17 ans 5 mois #2915 par Grégory
Bonjour tout d'abord

Je me présente un petit peu

Donc Nostra (Grégory de mon prénom) 25 ans, admin réseaux dans une PME de 90 personnes à Pontarlier (25)

je débute avec Powershell et essaie de comprendre la logique/syntaxe en m'amusant un peu ;)

un bon screenshot vaut mieux qu'un long discours donc c'est par là que ça se passe : img513.imageshack.us/my.php?image=psqm9.jpg

ça marche bien sauf qu'une des machines n'est pas allumée -> erreur


ma question : y a t'il moyen d'empêcher l'affichage de l'erreur ou de l'ignorer?

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

Plus d'informations
il y a 17 ans 5 mois #2918 par Laurent Dardenne
Salut,
Nostra écrit:

ma question : y a t'il moyen d'empêcher l'affichage de l'erreur ou de l'ignorer?

Si je ne me trompe il y a deux questions:
- la gestion des exceptions (erreurs)
- l'affichage des erreurs (exceptions).

Connais-tu le principe des exceptions ?

Certaines erreurs sont bloquantes, arrêt brutale du script, d'autre pas. Sous PS on parle d'erreur critique et d'erreur non-critique.

La gestion des exceptions se fait via la clause trap, un trés bon tutoriel US sur le sujet : huddledmasses.org/trap-exception-in-powershell/
Un autre script trés utile : blogs.msdn.com/powershell/archive/2006/12/07/resolve-error.aspx
Je vais surement te noyer d'informations mais il y a de quoi faire avec pour aborder le sujet des exceptions.

la réponse à ta question et oui, voici quelques exemples de construction :
[code:1]
trap [System.IO.FileNotFoundException]
{Write-Warning \"Gestion d'exception\"; Write-Error $_.Message; Continue}
&{[Reflection.Assembly]::LoadFile(\"C:\Inconnu.dll\"«»)}

trap [System.IO.FileNotFoundException]
{Write-Host \"Gestion d'exception\" -fore green; Write-Warning $_; Continue}
&{[Reflection.Assembly]::LoadFile(\"C:\Inconnu.dll\"«»)}

trap
{Break}
&{[Reflection.Assembly]::LoadFile(\"C:\Inconnu.dll\"«»)
Write-host \"la suite\"
}

trap
{Continue}
&{[Reflection.Assembly]::LoadFile(\"C:\Inconnu.dll\"«»)
Write-host \"la suite\"
}

trap
{Break}
&{[Reflection.Assembly]::LoadFile(\"C:\Inconnu.dll\"«»)}
Write-host \"la suite\"

trap
{Continue}
&{[Reflection.Assembly]::LoadFile(\"C:\Inconnu.dll\"«»)}
Write-host \"la suite\"

[/code:1]
mais avec WMI la gestion des erreurs est un peu particulière :
[code:1]
#Gestion pour toutes les exceptions mais cela ne fonctionne pas...
trap
{Write-Warning \"Gestion d'exception\"; Write-Error $_.Message; Continue}
&{get-wmiobject win32_process -Computer PSinconnu}


#Gestion pour toutes les exceptions mais on demande au cmdlet de la gérer, et on place l'erreur dans la variable ErrorWMI
trap
{Write-Warning \"Gestion d'exception\"; Write-Error $_.Message; Continue}
&{get-wmiobject win32_process -Computer PSinconnu -ea 0 -ev ErrorWMI; $ErrorWMI}


#Gestion pour toutes les exceptions mais on demande au cmdlet de la gérer, et on ajoute l'erreur dans la variable ErrorWMI
$ErrorWMI=$Null
trap
{Write-Warning \"Gestion d'exception\"; Write-Error $_.Message; Continue}
&{get-wmiobject win32_process -Computer PSinconnu -ea 0 -ev +ErrorWMI;
get-wmiobject Win32_product -Computer PS2inconnu -ea 0 -ev +ErrorWMI; $ErrorWMI
}
#Gestion simplifiée
$ErrorWMI=$Null
get-wmiobject win32_process -Computer PSinconnu -ea 0 -ev +ErrorWMI;
get-wmiobject Win32_product -Computer PS2inconnu -ea 0 -ev +ErrorWMI;
$ErrorWMI

#from www.vistax64.com/powershell/180262-how-w...or-interception.html
trap [Management.Automation.ActionPreferenceStopException]
{ Write-Warning \"Gestion d'exception\"; Write-Host $ErrorWMI; continue }
get-wmiobject win32_process -Computer PSinconnu -ea 1 -ev ErrorWMI;
#ou
trap [Management.Automation.ActionPreferenceStopException]
{ Write-Warning \"Gestion d'exception\"; Write-Host $ErrorWMI[0].Message; continue }
get-wmiobject win32_process -Computer PSinconnu -ea 1 -ev ErrorWMI;

[/code:1]
Ensuite il faudrait une gestion plus élaborée pour associer, dans un seule objet, l'IP et l'erreur ce qui éviterais de faire du parsing de chaînes.

Voir aussi
Managing non-terminating errors : blogs.msdn.com/powershell/archive/2006/04/25/583241.aspx

Debugging PowerShell Scripts : blogs.msdn.com/powershell/search.aspx?q=...onad+Scripts&p=1

Tutoriels PowerShell

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

Plus d'informations
il y a 17 ans 5 mois #2922 par Grégory
Réponse de Grégory sur le sujet Re:Ne pas afficher les erreurs
Oui tu m'as un peu submergé là ;)

mais j'ai trouver une soluce toute simple à mon problème

étant donné que l'erreur n'est pas blocante et vient simplement du fait que l'ordi n'est pas allumé

j'ai utilisé :

$ErrorActionPreference = \"SilentlyContinue\"

mais je vais tout de même me pencher sur la gestion d'erreur

merci encore

ps: je ne clos pas le topic au cas où j'aurais d'autres questions concernant les erreurs

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

Plus d'informations
il y a 17 ans 5 mois #2923 par Arnaud Petitjean
Bonjour Nostra et soit le bienvenu sur PowerShell-Scripting.com ;)

Si tu veux te présenter plus en détail, nous avons ouvert un fil de discussion adaptée : Qui êtes vous Powersheller's

Ce que je ferais si j'étais à ta place c'est d'abord tester si la machine est allumée ou non avant de lui lancer une requête WMI.
Pour cela tu pourrais faire un simple Ping et récupérer en retour le code d'erreur avec la variable automatique $LASTEXITCODE ou simplement True ou False avec la variable $?.

Exemple :
[code:1]
Ping.exe machine1 -n 1 > $null
if ($LASTEXITCODE -eq 0)
{
write-host 'Machine allumée !'
}
else
{
write-host 'Machine éteinte !'

}
[/code:1]

Le mieux serait d'en faire une fonction, comme ça tu l'apellerais avant chaque requête WMI.

Exemple :
[code:1]function Ping-Host
{
Ping.exe $args[0] -n 1 > $null
$LASTEXITCODE
if ($LASTEXITCODE -eq 0)
{
write-host 'Machine allumée !'
}
else
{
write-host 'Machine eteinte !'
}
}
[/code:1]

L'option -n 1 sert à n'envoyer qu'un seul ping, ce qui permet d'avoir une réponse rapide.

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 17 ans 5 mois #2924 par Arnaud Petitjean
Oui l'utilisation de $ErrorActionPreference à la valeur SilentlyContinue peut être une bonne option ;)

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 17 ans 5 mois #2925 par Grégory
Réponse de Grégory sur le sujet Re:Ne pas afficher les erreurs
En partant sur ton idée de tester via un ping je suis arrivé à ça :

[code:1]param ($procname = \".\"«»)
get-content ordi.txt|foreach{Ping.exe $_ -n 1 > $null
if ($LASTEXITCODE -eq 0)
{
$_|out-file -append -filepath c:\ordi-allum.txt
}
}
get-content ordi-allum.txt|foreach{
get-wmiobject win32_process -computername $_
}|where{$_.processname -eq $procname}|select processname,csname[/code:1]

bon passer par un fichier c'est vraiment pas propre :whistle:
d'autant plus que le -append pose problème vu que si on réexécute le script on réécrit à la suite du fichier

je pense qu'on peut mettre ça dans un tableau

reste plus qu'à voir comment fonctionnent les tableaux :laugh:<br><br>Message édité par: Nostra, à: 10/10/08 11:39

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

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