Question arret d'une boucle

Plus d'informations
il y a 15 ans 8 mois #2615 par daniel soares
arret d'une boucle a été créé par daniel soares
j'ai un pb qui semble simple mais je n'arrive pas a trouver de solution simple

j'ai une boucle sur une variable qui peut de temps en temps être vide mais l'action en boucle sur une variable vide génère une exception.
je voudrai définir une action différente si cette variable est vide. break semble adéquat d'après les docs mais break arrête le script et non pas juste la boucle

ex $liste est une liste d'adresses ip dont certaines peuvent être nulles

[code:1]
$list | foreach {
if $_ = \"\" {\"$_| out-file $fichier-append;break}
$a = gwmi win32_bios -computername $_
\"$_`t$a\" out-file $ficher -append
}

[/code:1]
j'ai essayé d'utiliser trap pour gérer l'erreur générée mais wmi a un timeout qui semble tres long donc ça ralentis énormément mon script
d'ailleurs sur ce deuxième point pour éviter de surcharger les events sécurité sur mes serveurs, existe il une commande pour que wmi ne fasse qu'une seule requête (il semble que par défaut il insiste beaucoup il m'arrive même de retrouver des essais de connexion 24 heures plus tard si j'ai laissé ma fenêtre powershell ouverte)

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

Plus d'informations
il y a 15 ans 8 mois #2616 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:arret d'une boucle
Salut,
pour le premier point ce ne serait pas ceci plutot :
[code:1]
if ($_ -eq \"\"«») {out-file $fichier -input $_ -append;return}
[/code:1]
En même temps je pense que tu peux réécrire ce traitement via un filtre Where.

Tutoriels PowerShell

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

Plus d'informations
il y a 15 ans 8 mois #2617 par daniel soares
Réponse de daniel soares sur le sujet Re:arret d'une boucle
génial c'est ce qu'il me fallait

le filtre where n'est pas adaptée car je veux aussi récupérer dans mon fichier final les fameux serveurs qui n'ont pas d'ip (entre autre)
cette commande m'évite les imbrications de if else qui étaient très lourdes a gérer.

je peux même l'utiliser avec la fonction trap pour gérer les exceptions.

[code:1]
$list |foreach {
trap{\"$server`t$($error[0])\"|Out-File $fichier -append;return}
$server =$_
if ($server -like \"\" ){\"$server`tpas d'ip pour ce serveur\"|Out-File $fichier -Append;return}
$backupservice = gwmi win32_service -computername $server -credential (import-credential $compte)|
where{$_.name -match \"BackupExecDeviceMediaService\"}
if ($backupservice -eq $null ){\"$server`tn'est pas serveur de backup\"|Out-File $fichier -Append;return}
$backupservice |
foreach{\"$server`t$($_.name)\"|
Out-File fichier -Append}
}
[/code:1]

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

Plus d'informations
il y a 15 ans 8 mois #2618 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:arret d'une boucle
Laurent Dardenne écrit:

En même temps je pense que tu peux réécrire ce traitement via un filtre Where.

Je suis allé plus vite que la musique...

Mais tu peux réduire le code comme ceci :
[code:1]
$liste|foreach {
if ($_ -ne \"\"«»)
{\"$_`t$(gwmi win32_bios -computername $_)\"}
else {$_}}|out-file $fichier -append

[/code:1]
[edit]
Nos posts se sont croisés.<br><br>Message édité par: Laurent Dardenne, à: 22/07/08 12:00

Tutoriels PowerShell

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

Plus d'informations
il y a 15 ans 8 mois #2619 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:arret d'une boucle
je me permets qq remarques, je pense qu'on peut simplifier ton code, car la présence du return n'est pas nécessaire dans ce contexte, de plus le comportement du cmdlet foreach-objet n'est pas tout à fait identique à l'instruction de boucle foreach.
On peut donc s'appuyer entiérement sur le principe du pipeline couplé avec des if-else. Comme dans un segment de pipeline chaque écriture est y émise par défaut, on déclare une seule fois le cmdlet out-file.
[code:1]
$list |foreach {
trap{\&quot;$server`t$($_)\&quot;;continue}
$server =$_
if ($server -like \&quot;\&quot; )
{\&quot;$server`tpas d'ip pour ce serveur\&quot;}
else
{$backupservice = gwmi win32_service -computername $server -credential (import-credential $compte)| where{$_.name -match \&quot;BackupExecDeviceMediaService\&quot;}
if ($backupservice -eq $null )
{\&quot;$server`tn'est pas serveur de backup\&quot;}
else {\&quot;$server`t$($backupservice.name)\&quot;}
}|Out-File $fichier -append
[/code:1]
L'usage du continue dans le gestionnaire d'exception(trap) permet de passer à l'élément suivant présent dans le pipe après y avoir émis une chaîne de caractère(le message de l'exception) mais sans l'afficher sur la console.
Si on ne le précise pas, l'affichage se fait sur la console ET dans le fichier sans provoquer l'arrêt du pipe à la différence de l'instruction break.

Pour WMI, j'ai trouvé ceci (bsonposh.com/archives/tag/demo) qui se base sur un ping de la machine cible AVANT d'exécuter la requête WMI.
Une astuce pleine de bon sens, à vérifier tout de même :-)

Tutoriels PowerShell

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

Plus d'informations
il y a 15 ans 8 mois #2620 par daniel soares
Réponse de daniel soares sur le sujet Re:arret d'une boucle
Laurent Dardenne écrit:

Comme dans un segment de pipeline chaque écriture est y émise par défaut, on déclare une seule fois le cmdlet out-file.


en effet ça simplifie le code et je n'aurai jamais cru que ce qui suit le pipe puisse fonctionner pour chaque occurrence.

j'adopte ton code malgré la gestion difficile des imbrications de if else. :)

surtout que le return sur trap me donne des résultats bizarres

merci pour l'info sur wmi je vais regarder ça de plus prêt car ça semble checker l'ouverture des ports nécessaires ce qui est le plus gros pb dans l'environnement ou je travaille.

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

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