Question Incrémentation de nom de variable

Plus d'informations
il y a 13 ans 5 mois #13167 par Nicolas Lang
Bonjour à vous!

Je cherche à créer une form qui va me créer automatiquement des boutons en fonction du nombre d'objets détectés par une requete.

Je me suis basé sur ce sujet powershell-scripting.com/index.php?optio...catid=5&id=11158 pour effectuer mon travail, mais j'avoue avoir besoin d'un éclaircissement.

tout d'abord, voici un brin de code adapté du code généré par Primal forms CE:


[code:1]

if ($detected -ne $null) #$detected correspond a ma premiere requete qui me renvoie une table de versions de softs
{
$x = -171
$y = 92
2..$detected.Count | foreach{

`$button$_.DataBindings.DefaultDataSourceUpdateMode = 0

$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = $x+184
$System_Drawing_Point.Y = $y+95
`$button$_.Location = $System_Drawing_Point
`$button$_.Name = \"button$_\"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 52
$System_Drawing_Size.Width = 100
`$button$_.Size = $System_Drawing_Size
`$button$_.TabIndex = $_
`$button$_.Text = $detected[$_]
`$button$_.UseVisualStyleBackColor = $True
`$button$_.add_Click(`$button$__OnClick)

Write-Host `$button$_ #pour test
#$form1.Controls.Add(`$button$_)
if ($x -le 381){$x += 184}
else {
$x = -171
$y +=95}
[/code:1]

Sauf que la, je me tape des erreurs (bien entendu, sinon je ne serai pas la :P) du style suivant :

[code:1]
`$button$_.Location : Le terme « `$button$_.Location » n'est pas reconnu comme nom d'applet de commande, fonction, fichier de script ou programme exécutable. Vérifiez l'orthographe du nom, ou si un chemin d'accès existe, vérifiez que le chemin d'accès est correct et réessayez.
[/code:1]

Je pense ne pas avoir saisi quelque chose du post précedent , mais quoi ... ?

Sauriez vous m'aider?<br><br>Message édité par: Darum, à: 30/11/12 12:27

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

Plus d'informations
il y a 13 ans 5 mois #13168 par SiSMik
Salut,

Tu as essayé avec New-Variable ?

[code:1]$i = 1
1..10 | % {
New-Variable \&quot;i$_\&quot; ($_ * $i)
}[/code:1]

@+

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

Plus d'informations
il y a 13 ans 5 mois #13178 par xyz
Réponse de xyz sur le sujet Re:Incrémentation de nom de variable
Darum écrit:

Je pense ne pas avoir saisi quelque chose du post précedent, mais quoi ... ?

La réponse est dans le code que tu nous soumets, réponse confortée par l'erreur que tu obtiens.

De plus si tu crées du code dynamique, il te faut nous communiquer le code générateur et pas le code généré, en tous cas les deux et pas l'un sans l'autre.

Pour rappel, les contributeurs des forums ne sont pas des magiciens, ni des pères Noël.

Tutoriels PowerShell

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

Plus d'informations
il y a 13 ans 5 mois #13184 par Matthew BETTON
Bonjour,

Laurent Dardenne écrit:

Darum écrit:
ni des pères Noël.


C'est vrai que nous sommes pourtant dans la bonne période, mais je suis de ton avis :)

@ +

Matthew<br><br>Message édité par: Matthew BETTON, à: 1/12/12 13:54

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

Plus d'informations
il y a 13 ans 5 mois #13263 par Nicolas Lang
En fait, voila le type de code \&quot;fixe\&quot; qui est crée pour la création d'un bouton :


[code:1]
$button7.DataBindings.DefaultDataSourceUpdateMode = 0

$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 380
$System_Drawing_Point.Y = 282
$button7.Location = $System_Drawing_Point
$button7.Name = \&quot;button7\&quot;
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 52
$System_Drawing_Size.Width = 100
$button7.Size = $System_Drawing_Size
$button7.TabIndex = 7
$button7.Text = \&quot;button7\&quot;
$button7.UseVisualStyleBackColor = $True
$button7.add_Click($button7_OnClick)

$form1.Controls.Add($button7)
[/code:1]

On remplace bien entendu le chiffre 7 dans $button7 par un chiffre quelconque.

Mon but est donc bien de mettre le chiffre du bouton dans une variable et de recréer à chaque fois un nouveau bouton avec un nom différent... d'ou mon code que j'ai tenté via les conseils fournis, ce qui donne cela :

[code:1]
if ($detected -ne $null) #$detected correspond a ma premiere requete qui me renvoie une table de versions de softs

{

$x = -171

$y = 92

2..$detected.Count | foreach{



`$button$_.DataBindings.DefaultDataSourceUpdateMode = 0



$System_Drawing_Point = New-Object System.Drawing.Point

$System_Drawing_Point.X = $x+184

$System_Drawing_Point.Y = $y+95

`$button$_.Location = $System_Drawing_Point

`$button$_.Name = \&quot;button$_\&quot;

$System_Drawing_Size = New-Object System.Drawing.Size

$System_Drawing_Size.Height = 52

$System_Drawing_Size.Width = 100

`$button$_.Size = $System_Drawing_Size

`$button$_.TabIndex = $_

`$button$_.Text = $detected[$_]

`$button$_.UseVisualStyleBackColor = $True

`$button$_.add_Click(`$button$__OnClick)



Write-Host `$button$_ #pour test

#$form1.Controls.Add(`$button$_)

if ($x -le 381){$x += 184}

else {

$x = -171

$y +=95}






[/code:1]

J'essaie de chercher l'erreur ... mais toujours rien.


@ benduru : tu peux m'expliquer ce que

[code:1]($_ * $i)[/code:1]

est censé faire dans le new-variable?<br><br>Message édité par: Darum, à: 10/12/12 15:20

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

Plus d'informations
il y a 13 ans 5 mois #13269 par xyz
Réponse de xyz sur le sujet Re:Incrémentation de nom de variable
Si tu veux construire du code dynamique il te faut créer une chaîne de caractères ( d'une ou + lignes):
[code:1]
#Here-String utilisant la substitution de variable
$MonCode=@\&quot;
`$Button.Text[$_]
\&quot;@
$MonCode
[/code:1]
Ici la substitution fonctionne à moitié, le $_ provenant du pipeline n'est pas renseigné.
A noter qu'on échappe bien le premier signe dollar de la variable Button.

On change donc son fusil d'épaule :
[code:1]
#Here-String n'utilisant pas la substitution de variable
$MonCode=@'
`$Button.Text[$_]
'@
$MonCode
[/code:1]
C'est déjà mieux, mais il en manque un bout.
Pool !
[code:1]
$MonCode=@'
`$Button.Text[$_]
'@
1..5|% {$ExecutionContext.InvokeCommand.ExpandString($moncode)}
[/code:1]
On doit construire une ligne de code, puis gérer l'appel de la substitution.
Ici le travail consiste à créer le code mentalement

Maintenant que tu sais construire une ligne de code, on pousse le curseur.
[code:1]
#Le code à créer
$MonCode=@'
`$Button.Text[$_]
'@

#Dans la chaîne $S on manipule un tableau
#On utilise comme séparateur d'élement de tableau, la suite de caractères RC+LF
#On veut, à partir du tableau, + lignes et pas une seule.
$ofs=\&quot;`r`n\&quot;

#Le code de la forme
#La construction $( ) permet d'exécuter du code dans une chaîne de caractère
#Ce code renvoi un tableau, dans une chaine entre double quote, un tableau est
#transformé en une chaine, d'où l'affectation de Output Field Separator ($OFS)
# rkeithhill.wordpress.com/2009/04/05/effe...field-separator-ofs/

$S=@\&quot;
#Code de la Form
$(
1..5|% {$ExecutionContext.InvokeCommand.ExpandString($moncode)}
)
\&quot;@

#Une fois le code construit on peut l'exécuter
#Invoke-Command $S
[/code:1]
Tes erreurs sont dues à une mixture de code généré et générant, couplé à une exécution incontrolé au sein du Foreach.

Pour résumer ton code doit créer du texte, celui-ci représente du code et enfin c'est le scripteur qui déclenche l'exécution du code généré.

La suite ici :
laurent-dardenne.developpez.com/articles...sme-sous-PowerShell/

Tutoriels PowerShell

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

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