Question
créer un tableau de tableaux
- gerome
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 7
- Remerciements reçus 0
je veux créer automatiquement (et non manuellement, je pourrai le faire ainsi mais ça n'a pas de sens) une variable $boxes qui regroupe 7 tableaux $box0, $box1, ... $box6. Chacun des 7 tableaux doit comporter une colonne "Client" et une colonne "Count", qui sont vides : je les remplirai plus tard.
J'ai essayé avec différentes formulations auprès de chatGPT et Bard qui ne me sortent rien qui fonctionne correctement.
Voici la version actuelle de mon code qui ne fonctionne pas
# Créer une variable pour stocker les tableaux "box0", "box1", ...
$boxes = @()
# Créer les tableaux (variables) et les ajouter à la varialbe $boxes
for ($i = 0; $i -lt 7 ; $i++) {
# Créer le tableau avec les colonnes "Client" et "Count"
$box[$i] = @(
[PSCustomObject]@{
Client = $null
Count = $null
}
)
# Ajouter le tableau au tableau $boxes
$boxes += $box
}
# Afficher le contenu de $boxes
$boxes
Merci pour votre aide !
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6298
- Remerciements reçus 68
un peu de lecture :
github.com/LaurentDardenne/Tutorial/tree...%20sous%20PowerShell
$boxes = @() crée un tableau de zéro élément, on ne peut donc l'indexer, sauf si tu y insères qq chose.
$boxes += $box ajoute un élément en créant un nouveau tableau à chaque appel ( c'est le framework dotNet qui se comporte ainsi).
Ensuite $i pointe tjr 'hors' des limites du tableau.
Mais surtout tu crées $Boxes mais tu adresses $box, ça risque pas de marché

$boxes += @(
[PSCustomObject]@{
Id=$i
Client = $null
Count = $null
}
)

Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- gerome
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 7
- Remerciements reçus 0
J'appréhende beaucoup de nouveaux concepts du monde de l'informatique en même temps, et un retour aux bases est sûrement nécessaire. En effet, par exemple je ne sais pas ce qu'est un framework, donc une petite recherche wikipedia m'a permis de comprendre que c'est un ensemble cohérents de composants logiciels qui sert au développement. Je ne comprends toujours pas très bien à quoi cela sert, même si au moins je sais que cela existe.
Dans le lien "Structures de données sous Powershell", pour la phrase "Vous noterez dans la définition C# de cette classe la présence de nombreuses interfaces : public abstract class Array : IClonetable, Ilist, ICollection, IEnumerable" qu'est-ce qu'une interface ?
J'avoue ne pas avoir tout lu de ce document, seulement la partie qui semblait m'intéresser pour mon cas (2.1 Les manipulations de base, 2.1.1 et 2.1.2). Cela reste technique pour moi, mais je ne désespère pas de tout comprendre un jour.
Pour en revenir à mon cas, en effet lorsque j'écris $boxes = @() je crée un tableau de zéro élément, dans lequel je vais par la suite insérer mes tableaux $box0, $box1, ... $box6
C'est ce que je souhaite faire.$boxes += $box ajoute un élément en créant un nouveau tableau à chaque appel ( c'est le framework dotNet qui se comporte ainsi).
J'ai réussi à obtenir ce que je voulais, voici le code :
# Créer un tableau vide pour stocker les tableaux $box0, $box1, etc.
$boxes = @()
# Créer les tableaux (variables) et les ajouter à la varialbe $boxes
for ($i = 0; $i -lt 7; $i++){
$box = @(
[PSCustomObject]@{
Client = $null
Count = $null
}
)
# Ajouter la boîte créée à $boxes
$boxes += $box
# Créer une variable $boxN, où N est l'indice de la boucle, de façon à ce qu'à la prochaine itération, la variable qui vient d'être créée ne soit pas effacée
Set-Variable -Name "box$i" -Value $box
}
# ensuite, on peut vérifier que cela fonctionne en affichant $box0, ou $box1, etc.
J'ai encore deux questions par rapport à tout ça :
Lorsque je veux afficher $boxes, j'ai la même chose qui s'affiche que lorsque j'affiche $box0 ou $box1 par exemple. Pourquoi ? Est-ce normal ?
Peux-tu expliciter le piège que je viens de rencontrer ? Je n'ai pas compris.
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6298
- Remerciements reçus 68
>>Je ne comprends toujours pas très bien à quoi cela sert.
En gros c'est une boîte à outils qui évite de coder des besoins de 'base' (pour le framework dotNet en tous cas).
>>J'avoue ne pas avoir tout lu de ce document, seulement la partie qui semblait m'intéresser pour mon cas
Oui c'était mon idée d'origine, j'en dit plus que nécessaire.
>>Cela reste technique pour moi
Oui c'est plutôt hard pour débuter

>>qu'est-ce qu'une interface ?
C'est un concept de programmation objet.
Un concept avancé mais il est utile je pense de savoir ce que cela peut apporter.
Avec cette notion on s’intéresse davantage à ce que sait faire une classe, à ces capacités, et non à ce qu’elle est, ses caractéristiques.
Une interface permet également de manipuler des objets provenant de hiérarchies de classes différentes ayant une capacité commune,
par exemple une connexion réseau pour un serveur ou un téléphone portable.
Chacune sait se connecter à un réseau, on peut envisager une interface IConnectable.
voir ce tuto (chapitre 4)
github.com/LaurentDardenne/Tutorial/tree...%20sous%20PowerShell
Les structures de données de construction différente, propose toutes le comportement 'itération'.
Powershell permet de manipuler de manière identique des structures de données différentes, ce qui évite de connaitre les détails d'implémentation de chacune.
>>Peux-tu expliciter le piège que je viens de rencontrer ? Je n'ai pas compris.
Avec un langage compilé tous ce qui est manipulé dans le code doit être préalablement définie.
Si ce n'est pas le cas la compilation déclenchera des erreurs, c'est un garde fou/une sécurité.
Powershell étant dynamique, ce type de contrôle n'existe pas. C'est à la personne qui code de prendre en charge ce type de contrôles.
#Ajoute des contrôles
set-strictmode -Version latest
# Créer une variable pour stocker les tableaux "box0", "box1", ...
$boxes = @()
# Créer les tableaux (variables) et les ajouter à la varialbe $boxes
for ($i = 0; $i -lt 7 ; $i++) {
# Créer le tableau avec les colonnes "Client" et "Count"
$box[$i] = @(
[PSCustomObject]@{
Client = $null
Count = $null
}
)
# Ajouter le tableau au tableau $boxes
$boxes += $box
}
# Afficher le contenu de $boxes
$boxes
[code]
Une autre solution :
[code]
# Créer les tableaux et les ajouter à la variable $boxes
#Ici on utilise le pipeline de powershell
#La syntaxe $boxes =@() permet de toujours récupérer un tableau ( cas : $i -lt 1)
$boxes =@(
for ($i = 0; $i -lt 7; $i++){
#l'opérateur virgule/comma évite l'énumération du tableau dans le pipeline
#si le tableau contient un seul élément Powershell émet dans le pipeline l'élément mais pas le tableau dans lequel il est contenu
#C'est du Powershell, c'est comme ça.
,@(
[PSCustomObject]@{
ID=$i
Client = $null
Count = $null
}
)
}
)
$Boxes.GetType()
$Boxes.count
$Boxes[0].GetType()
$Boxes[0].count
Mais après relecture de ton premier message j'ai du mal à comprendre ce que tu cherches à avoir en résultat.
>>une variable $boxes qui regroupe 7 tableaux $box0, $box1, ... $box6.
Si tu as un tableau de tableau ($Boxes), les variables $box1..$box6 sont inutiles.
$Box1 est contenu dans $Boxes[0]
>>Lorsque je veux afficher $boxes, j'ai la même chose qui s'affiche que lorsque j'affiche $box0 ou $box1 par exemple. Pourquoi ? Est-ce normal ?
Je n'ai pas compris, mais ton dernier code manipule des références (des adresses) et pas des valeurs.
$boxes = @()
for ($i = 0; $i -lt 7; $i++){
$box = @(
[PSCustomObject]@{
ID=$i
Client = $null
Count = $null
}
)
# Ajouter la boîte créée à $boxes
$boxes += $box
# Créer une variable $boxN, où N est l'indice de la boucle, de façon à ce qu'à la prochaine itération, la variable qui vient d'être créée ne soit pas effacée
Set-Variable -Name "box$i" -Value $box
}
$boxes
# ID Client Count
# -- ------ -----
# 0
# 1
# 2
# 3
# 4
# 5
# 6
$box0
# ID Client Count
# -- ------ -----
# 0
#on modifie un élément du tableau mais on 'modifie' également la variable $box0
#$box0 est une variable qui contient une adresse en mémoire
#La variable $box0 pointe vers l'adresse mémoire de $boxes[0]
$boxes[0].id=99
$box0
# ID Client Count
# -- ------ -----
# 99
Enfin évite d'utiliser au début le cmdlet 'Set-Variable', on peut coder la plupart du temps sans l'utiliser.
Bien que l'on peut coder un problème de plusieurs manières, de choisir la plus simple à relire est préférable ( tant que faire se peut

Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- gerome
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 7
- Remerciements reçus 0
Je pense que davantage de contexte est nécessaire pour que l'on se comprenne.
Synthétiquement: j'ai pour mission de mettre en place un planning de mise à jour de serveurs windows. Il y a en a actuellement quelques centaines. On veut mettre à jour les serveurs une fois toutes les 12 semaines, à raison d'environ une cinquantaine par semaine. Elément important, on veut mettre à jour l'infra d'un client en même temps, donc pas de découpage dans le planning d'un client pour lequel on mettrait à jour une partie de son infra semaine 1 puis l'autre partie semaine 2 : on met toute son infra à jour la même semaine. Cela est possible car la plus grosse infra comporte 50 serveurs. Si un jour un client arrive avec une infra de 100 serveurs, on réfléchira à une autre façon de faire, pour l'instant ce n'est pas à l'ordre du jour.
Pour ce faire, je dispose d'un fichier .csv qui contient plusieurs colonnes à propos des clients, dont une colonne pour le nom du client et une colonne pour le nom du serveur.
Ce que j'ai déjà fait et qui fonctionne (je ne publie pas le code parce que je ne sais pas si j'ai le droit pour des raisons de confidentialité par rapport à mon entreprise) :
1) exporter le fichier .csv dans une variable pour le travailler avec un "| Select-Object Client, NomServeur", car je n'ai pas besoin des autres informations
2) connaître le nombre d'occurrences pour chaque client (=savoir combien de serveur possède chaque client) avec "| Group-Object -Property Client"
3) ajouter une colonne vide "box" (que j'aurais pu appeler semaine) à la variable, ce qui me permettra de savoir dans mon script quels clients sont déjà planifiés, et quels clients il reste à planifier.
4) diviser le nombre de serveurs par 12 : si ce résultat est supérieur à 55, cela signifie qu'il y aura plus de 55 serveurs à mettre à jour chaque semaine. C'est juste une alerte, il n'est pas prévu que le cas se présente.
5) si le nombre de serveurs à mettre à jour chaque semaine avec une mise à jour chaque semaine pendant 12 semaines ($maxDivisor, alors on retire 1 à 12 ($maxdivisor --) et on recommence la division $nombreDeServeurs / $maxDivisor tant que le résultat de la division est inférieur à 47.
C'est pour savoir sur combien de semaines on fait des mises à jour, parce que le but est que lorsqu'on fait des mises à jour on ait une cinquantaine de serveurs à mettre à jour.
6) créer une variable $boxes qui regroupe tous les tableaux vides $box0, $box1, jusqu'à $box6 dans le cas présent.
Il me reste à faire "le plus dur", c'est-à-dire remplir mes fameuses $box0, $box1, jusqu'à $box6
J'ai une idée pour le faire mais j'écrirai plus à ce sujet demain, il se fait tard.
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6298
- Remerciements reçus 68
C'est juste pour un test d'affichage
>>Je pense que davantage de contexte est nécessaire pour que l'on se comprenne.
C'est plus mieux

Pour "| Select-Object Client, NomServeur"
Avec Select-Objet tu peux ajouter/créer une propriété (sens Objet), ce que tu appelles une colonne (sens Tableur)
exemple : Select-Object Client, NomServeur,Semaine,fait,Afaire,enCours
>> ajouter une colonne vide "box" (que j'aurais pu appeler semaine) à la variable
C'est important de nommer les variables au plus de prés de ce qu'elle représentent/contiennent, je dis ça je dis rien

QUELLE variable ? Celle issue de "| Select-Object Client, NomServeur" ?
>>quels clients sont déjà planifiés, et quels clients il reste à planifier.
Cela ne concerne pas le problème que tu rencontres, c'est autre chose, c'est bien cela ?
Pas sûr de comprendre l'aspect fonctionnel du point 5.
>>6) créer une variable $boxes qui regroupe tous les tableaux vides $box0, $box1, jusqu'à $box6 dans le cas présent.
Désolé je ne comprend pas ce point.
>>Il me reste à faire "le plus dur", c'est-à-dire remplir mes fameuses $box0, $box1, jusqu'à $box6
Jusqu'ici je comprend à peu près l'objectif et les données manipulées.
Si $Box1..6 représente des semaines, pourquoi pq pas $box1..12 (période) ou 200( clients) ?
Je ne vois de notion de date.
As-tu une base données pour la persistance de ces infos ou c'est un outil qui gère cela (ordonnanceur) ?
Je suppose que le scénario présenté ici est une version simplifiée, en tout cas quand tout se passe bien ?
Donne nous un exemple de manipulation ( en pseudo code) de ta structure qu'on comprenne mieux.
Les relations entre objets son parfois difficile à saisir, d'où l'usage de diagramme de classe ou de MCD .
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- créer un tableau de tableaux