2009-03-13 11 views
9

Est-ce que la dernière version de Powershell ont la possibilité de faire quelque chose comme de JavaScript:Structs ou des objets dans Powershell 2

var point = new Object(); 
point.x = 12; 
point.y = 50; 

Sinon, quel est l'équivalent ou solution de contournement?

MISE À JOUR
Lire tous les commentaires

Répondre

13

La syntaxe est pas pris en charge directement par la fonctionnalité est là via la cmdlet Add-membres de. Il y a quelque temps, j'ai enveloppé cette fonctionnalité dans une fonction de tuple à usage général.

Ceci vous donnera la possibilité de créer ces objets sur une seule ligne.

$point = New-Tuple "x",12,"y",50 

Voici le code pour New-Tuple

function New-Tuple() 
{ 
    param ([object[]]$list= $(throw "Please specify the list of names and values")) 

    $tuple = new-object psobject 
    for ($i= 0 ; $i -lt $list.Length; $i = $i+2) 
    { 
     $name = [string]($list[$i]) 
     $value = $list[$i+1] 
     $tuple | add-member NoteProperty $name $value 
    } 

    return $tuple 
} 

Blog post sur le sujet: http://blogs.msdn.com/jaredpar/archive/2007/11/29/tuples-in-powershell.aspx#comments

+0

+1 J'aime ça. Vous savez ... avant que j'aie posé la question, j'aurais dû penser à utiliser une hashtable Powershell. Mais approche très cool. – BuddyJoe

+0

Merci. Juste quelques lectures sur psobject, add-member, NoteProperty ... des trucs sympas. Appris quelque chose aujourd'hui :) – BuddyJoe

+0

Si vous êtes intéressé par 'Tuple' vous pouvez lire [cette réponse] (http://stackoverflow.com/questions/5882187/how-use-system-tuple-in-powershell/5885531#5885531) . C'est sur le haut de CLR 4.0. – JPBlanc

3

Vous pouvez le faire comme ceci:

$point = New-Object Object | 
    Add-Member NoteProperty x ([int] 12) -passThru | 
    Add-Member NoteProperty y ([int] 15) -passThru 

En ce qui concerne l'un des vos commentaires ailleurs, les objets personnalisés peuvent être plus utiles que les tables de hachage car ils fonctionnent mieux w Les cmdlets qui attendent des objets des propriétés nommées. Par exemple:

$mypoints | Sort-Object y # mypoints sorted by y-value 
3
+0

Oui, James nous donne la plupart des réponses. Il existe une autre option simple pour les classes qui ne sont que des sacs de propriétés: $ Object = "" | Sélectionnez Prop1, Prop2, Prop3 – JasonMArcher

+1

Il existe également cette fonction qui convertit une hashtable en objet: http://powershell.com/cs/blogs/tips/archive/2008/11/14/converting-hash-tables-to- objets.aspx – JasonMArcher

+0

@JasonMArcher: J'ai +1 de la réponse, mais je veux vraiment dire de poster votre conseil - pour moi, c'est plus propre que l'accepté et je l'ai utilisé. Maintenant, pour trouver un autre message à +1 à la place! –

5

Désolé, même si la réponse choisie est bonne, je ne pouvais pas résister à une ligne hacky réponse:

New-Object PsObject | Select-Object x,y | %{$_.x = 12; $_.y = 50; $foo = $_; } 
+0

Personnellement, j'aime la syntaxe multi-affectation: ... | % {$ _. x, $ _. y, $ foo = 12,50, $ _} – stej

9

Pour des façons simples, d'abord, est une table de hachage (disponible en V1)

$obj = @{} 
$obj.x = 1 
$obj.y = 2 

En second lieu, est un PSObject (plus facile à V2)

$obj = new-object psobject -property @{x = 1; y =2} 

Il vous donne à peu près le même objet, mais psobjects sont plus agréables si vous voulez trier/groupe/format/les exporter

+0

Très bonne réponse. +1 – BuddyJoe

0
$point = "" | Select @{Name='x'; Expression={12}} ,@{Name='y'; Expression={15}} 

ou plus intuitivement

$point = "" | Select x,y 
$point.x=12; $point.y=15 
Questions connexes