1
votes

Comment obtenir toutes les instances d'une classe?

Ma connaissance des cours est relativement nouvelle. Mais je veux sortir tous les objets / instances d'une classe avec PowerShell. Est-ce seulement possible? Voici un exemple de la façon dont je crée deux objets de la classe Computer.

Class Computer {
    [String]$Name
    [String]$Description
    [String]$Type

}

$NewComputer = New-Object 'Computer'
$NewComputer.Name = 'ultra1'
$NewComputer.Description = 'Lenovo Yoga 900'
$NewComputer.Type = 'Ultrabook' 

$NewComputer = New-Object 'Computer'
$NewComputer.Name = 'ultra2'
$NewComputer.Description = 'Lenovo Yoga X1'
$NewComputer.Type = 'Ultrabook' 

Maintenant, je veux afficher les deux objets, comment puis-je faire cela?


3 commentaires

Qu'entendez-vous exactement par «sortie». À quoi ressemblerait le résultat souhaité?


Remarque: vous voudrez peut-être éviter d'utiliser des guillemets typographiques dans le code. Alors qu'ils travaillent la plupart du temps, j'ai rencontré des situations où ils ont causé des problèmes.


Je veux juste aborder tous les objets de la classe et voir leurs valeurs.


3 Réponses :


0
votes

Cela aidera peut-être

Class Computer {
    [String]$Name
    [String]$Description
    [String]$Type

}

# a collection of computers
$computers =@()

$NewComputer = New-Object 'Computer'
$NewComputer.Name = ‘ultra1’
$NewComputer.Description = ‘Lenovo Yoga 900’
$NewComputer.Type = ‘Ultrabook’ 

# append a computer to teh collection
$computers += $NewComputer

$NewComputer = New-Object 'Computer'
$NewComputer.Name = ‘ultra2’
$NewComputer.Description = ‘Lenovo Yoga X1’
$NewComputer.Type = ‘Ultrabook’ 

# append a computer to teh collection
$computers += $NewComputer

# this outputs each of the computers
$computers

# or you can format the data in a table
$computers | Format-Table -AutoSize

# or in a list
$computers | Format-List *

# or as json
$computers | ConvertTo-Json


4 commentaires

Malheureusement, ce n'est pas le résultat espéré que je recherche, en fait j'écris également tous les objets dans un tableau. Mais je m'intéresse au principe s'il y a une possibilité d'obtenir les objets d'une classe sans les mettre dans une collection.


@ jeremiaskühnis Alors pourquoi ne pas utiliser des variables différentes pour chaque ordinateur que vous créez en utilisant votre classe ?? $ pcUltra1 = Nouvel objet 'Ordinateur'; $ pcUltra2 = Nouvel objet 'Ordinateur' etc.


oui je l'ai déjà fait, désolé pour ma question peut-être pas claire .... je veux savoir s'il existe une méthode pour lire les objets d'une classe sans "contournement" comme les mettre dans des collections ou utiliser des variables différentes. Quelque chose comme get-classObjects -class "computer" serait bien ;-)


@ jeremiaskühnis Vous pouvez utiliser Get-Variable et examiner de manière réfléchie les types d'objet, mais si votre objet perd sa liaison (par exemple, vous réaffectez un nom), cela ne fonctionnera pas. La seule façon de le faire fonctionner avec certitude est de créer une collection statique sur votre classe et dans votre constructeur, d'ajouter cet objet à une collection.



0
votes

À en juger par votre commentaire "s'il y a une possibilité d'obtenir les objets d'une classe sans les mettre dans une collection" , je pense que ce que vous voulez faire est de créer un nouvel Ordinateur les objets utilisant votre classe et plus tard utilisent ces objets comme des variables séparées.

Pour une création plus facile, je vous suggère d'ajouter un constructeur à la classe, vous pouvez donc créer les objets sur une seule ligne:

Name   Description     Type     
----   -----------     ----     
ultra1 Lenovo Yoga 900 Ultrabook
ultra2 Lenovo Yoga X1  Ultrabook

Sortie :

Class Computer {
    [String]$Name
    [String]$Description
    [String]$Type

    # add a constructor
    Computer(
        [string]$n,
        [string]$d,
        [string]$t
    ){
        $this.Name = $n
        $this.Description = $d
        $this.Type = $t
    }
}

# now create the computer objects
[Computer]$pcUltra1 = [Computer]::new('ultra1','Lenovo Yoga 900','Ultrabook')
[Computer]$pcUltra2 = [Computer]::new('ultra2','Lenovo Yoga X1','Ultrabook')

# show what you have now
$pcUltra1
$pcUltra2

J'espère que cela aide


2 commentaires

btw, vous n'avez pas besoin de ce constructeur: [Computer] @ {Name = 'ultra1'; Description = 'Lenovo Yoga 900'; Type = 'Ultrabook'} . Le système de typage est incroyablement puissant :)


@ TheIncorrigible1 Ah, je ne le savais pas. Merci.



0
votes

En supposant que vous n’avez lié aucun nom, vous pouvez effectuer les opérations suivantes:

Get-Variable | Select-Object -ExpandProperty Value |
    Where-Object { $_.GetType().Name -eq 'Computer' }


0 commentaires