Question Incrémenter le nom d'une variable

Plus d'informations
il y a 12 ans 2 mois #11158 par DARTEVELLE
Bonjour,

Après être tombé pas mal de fois sur ce forum pour des petits problèmes avec powershell, j'ai décidé de m'y inscrire ;)

Cette fois-ci j'ai un soucis je pense assez simple, mais dont je ne trouve pas la solution :angry:

J'ai ce code :

[code:1]foreach ($i in $liste) {
[...]
if ($content -Like \"*<B>Toner noir ~9*\"«») {
$objProgressBar$i.Value = 90
}
if ($content -Like \"*<B>Toner noir ~8*\"«») {
$objProgressBar$i.Value = 80
}
[...]
}
[/code:1]

J'aimerais avoir en fait plusieurs variable $objProgressBarxx, avec xx la valeur de $i. $i peut avoir comme valeur 14, 15, 16, 17 et d'autres chiffres dans ce style.

Quelque chose qui doit être simple m'échappe.

Merci d'avance de votre aide :)<br><br>Message édité par: Theo25, à: 17/02/12 09:02

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

Plus d'informations
il y a 12 ans 2 mois #11159 par Arthur
Salut,

Une des façons d'utiliser les variables dynamiques :

[code:1]0..10|%{ New-Variable \&quot;MaVar_$_\&quot; $_ }
$MaVar_0
0..10|%{ Set-Variable \&quot;MaVar_$_\&quot; \&quot;toto$_\&quot; }
$MaVar_1[/code:1]

Je te préviens tout de même que les variables dynamiques apportent souvent plus de problèmes que de solutions.

Cdt.

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

Plus d'informations
il y a 12 ans 2 mois #11160 par Arthur
J'avais oublié :

[code:1]0..10|%{ Write-Host $((Get-Variable \&quot;MaVar_$_\&quot;«»).value) }[/code:1]

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

Plus d'informations
il y a 12 ans 2 mois #11161 par DARTEVELLE
Merci pour ta réponse :)

J'ai contourner un peu mon problème avec ceci :

[code:1] if ($i -eq \&quot;10\&quot;«») {
$objProgressBar10.Value = $objProgressBar.Value
}
if ($i -eq \&quot;11\&quot;«») {
$objProgressBar11.Value = $objProgressBar.Value
}
if ($i -eq \&quot;12\&quot;«») {
$objProgressBar12.Value = $objProgressBar.Value
}
if ($i -eq \&quot;13\&quot;«») {
$objProgressBar13.Value = $objProgressBar.Value
}
if ($i -eq \&quot;14\&quot;«») {
$objProgressBar14.Value = $objProgressBar.Value
}[/code:1]

Ma solution est simple, mais ça rajoute beaucoup de code, et faut faire ça pour chaque valeur de $i.

Etant donné que je n'ai qu'une dizaine de valeur possible, ça va encore.

Mais je garde ta solution de côté si jamais je dois traiter beaucoup plus de valeur :)

Merci !

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

Plus d'informations
il y a 12 ans 2 mois #11173 par Laurent Dardenne
Salut,
bilbao écrit:

Je te préviens tout de même que les variables dynamiques apportent souvent plus de problèmes que de solutions.

Un exemple ? Une paires d'arguments ?
Là bilbao, il manque un truc ;-)

Theo25 écrit:

J'ai contourner un peu mon problème avec ceci :

Ce qui, pour moi, est rarement la bonne solution, souvent la plus rapide et toujours au détriment de la compréhension...

Une autre solution :
[code:1]
#Crée un objet personnalisé
$objProgressBar=1|Select Value
$objProgressBar.Value=\&quot;951\&quot;

#Affiche le code de construction des variables
# le bactick (`) retarde l'interprétation des noms de variable, seul le numéro accolé au nom de variable est substitué, ici $_.
1..5|Foreach { write-host \&quot;`$objProgressBar$_=1|Select Value;`$objProgressBar$_.Value=$_;gv objProgressBar$_\&quot;}

# $objProgressBar1=1|Select Value;$objProgressBar1.Value=1;gv objProgressBar1
# $objProgressBar2=1|Select Value;$objProgressBar2.Value=2;gv objProgressBar2
# $objProgressBar3=1|Select Value;$objProgressBar3.Value=3;gv objProgressBar3
# $objProgressBar4=1|Select Value;$objProgressBar4.Value=4;gv objProgressBar4
# $objProgressBar5=1|Select Value;$objProgressBar5.Value=5;gv objProgressBar5

#Exécute le code de construction des variables
1..5|Foreach { Invoke-Expression \&quot;`$objProgressBar$_=1|Select Value;`$objProgressBar$_.Value=$_;gv objProgressBar$_\&quot;}

# Name Value
# ----
# objProgressBar1 @{Value=1}
# objProgressBar2 @{Value=2}
# objProgressBar3 @{Value=3}
# objProgressBar4 @{Value=4}
# objProgressBar5 @{Value=5}


1..5|% {iex \&quot;`$objProgressBar$_.Value = `$objProgressBar.Value;gv objProgressBar$_\&quot;}

# Name Value
# ----
# objProgressBar1 @{Value=951}
# objProgressBar2 @{Value=951}
# objProgressBar3 @{Value=951}
# objProgressBar4 @{Value=951}
# objProgressBar5 @{Value=951}
[/code:1]
Ainsi donc, ton code d'origine :
[code:1]
if ($i -eq \&quot;10\&quot;«») {
$objProgressBar10.Value = $objProgressBar.Value
}
if ($i -eq \&quot;11\&quot;«») {
$objProgressBar11.Value = $objProgressBar.Value
}
if ($i -eq \&quot;12\&quot;«») {
$objProgressBar12.Value = $objProgressBar.Value
}
if ($i -eq \&quot;13\&quot;«») {
$objProgressBar13.Value = $objProgressBar.Value
}
if ($i -eq \&quot;14\&quot;«») {
$objProgressBar14.Value = $objProgressBar.Value
}
#'Lignes' ad lib, 'Code' pat.
[/code:1]
se trouve résumé à :
[code:1]
$i=5
Invoke-Expression \&quot;`$objProgressBar$i.Value = `$objProgressBar.Value\&quot;}
#iex \&quot;`$objProgressBar$i.Value = `$objProgressBar.Value;gv objProgressBar$i\&quot;}
[/code:1]
Dans ta formulation d'origine \&quot;J'aimerais avoir en fait plusieurs variable $objProgressBarxx\&quot; si le besoin est bien sur ce point, la solution d'implémentation, car il n'en existe pas 50, est basée sur du code qui lui contient \&quot;des noms de variables contextuelles\&quot;, l'opération de construction étant sur le code et pas sur les variables.
D'où l'approche de bilbao qui a correctement répondu à ta formulation.

Et si je peux me permettre, n'hésites pas les prochaines fois que tu postes, dans le cas où la solution proposée ne satisfait pas ton besoin, à exprimer clairement pourquoi.

Cordialement.<br><br>Message édité par: Laurent Dardenne, à: 18/02/12 14:16

Tutoriels PowerShell

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

Plus d'informations
il y a 12 ans 2 mois #11176 par DARTEVELLE
Merci pour cette solution très complète.

La solution de Bilbao répond tout a fait à mon problème, tout comme la tienne qui est très complète.

Du coup j'ai une petite question sur ta solution.

[code:1]1..5|Foreach { Invoke-Expression \&quot;`$objProgressBar$_=1|Select Value;`$objProgressBar$_.Value=$_;gv objProgressBar$_\&quot;}
[/code:1]

\&quot;1..5\&quot; veut bien dire que l'on va avoir :

$objProgressBar1
$objProgressBar2
$objProgressBar3
$objProgressBar4
$objProgressBar5

Mais si on veut une liste comme celle-ci :

[code:1]$liste = @(10,11,12,13,14,15,74,76)[/code:1]


Merci d'avance :)

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

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