2009-03-13 14 views
9

significa l'ultima versione di PowerShell hanno la capacità di fare qualcosa di simile di JavaScript:Structs o oggetti in PowerShell 2

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

Se no, qual è l'equivalente o una soluzione alternativa?

UPDATE
Leggi tutti i commenti

risposta

13

La sintassi non è direttamente supportato dalla funzionalità è lì tramite l'add-membri cmdlet di. Qualche tempo fa, ho avvolto questa funzionalità in una funzione tupla per uso generale.

Questo ti darà la possibilità di creare una linea per creare questi oggetti.

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

Qui è il codice per 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 
} 

Post sul tema: http://blogs.msdn.com/jaredpar/archive/2007/11/29/tuples-in-powershell.aspx#comments

+0

+1 Mi piace. Sai ... prima che glielo chiedessi avrei dovuto pensare solo a usare un hash di Powershell. Ma approccio molto interessante. – BuddyJoe

+0

Grazie. Ho appena letto su psobject, add-member, NoteProperty ... roba fica. Ho imparato qualcosa oggi :) – BuddyJoe

+0

Se sei interessato in 'Tupla' puoi leggere [questa risposta] (http://stackoverflow.com/questions/5882187/how-use-system-tuple-in-powershell/5885531#5885531) . È in cima a CLR 4.0. – JPBlanc

3

si può fare in questo modo:

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

Per quanto riguarda una delle i tuoi commenti altrove, gli oggetti personalizzati potrebbero essere più utili delle tabelle hash perché funzionano meglio w I cmdlet che si aspettano che gli oggetti abbiano proprietà con nome. Per esempio:

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

Sì, James ci dà la maggior parte delle risposte. C'è un'altra opzione semplice per le classi che sono solo pacchetti di proprietà: $ Object = "" | Seleziona Prop1, Prop2, Prop3 – JasonMArcher

+1

C'è anche questa funzione che converte un hashtable in un oggetto: http://powershell.com/cs/blogs/tips/archive/2008/11/14/converting-hash-tables-to- oggetti.aspx – JasonMArcher

+0

@JasonMArcher: Ho fatto +1 alla risposta, ma in realtà intendevo postare il tuo suggerimento - per me è più ordinato di quello accettato e l'ho usato. Ora per trovare un altro post del tuo su +1, invece! –

5

Siamo spiacenti, anche se la risposta selezionata è buono, non ho potuto resistere alla hacky una riga risposta:

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

Personalmente mi piace la sintassi multiassegnazione: ... | % {$ _. x, $ _. y, $ foo = 12,50, $ _} – stej

9

Per semplici modi, in primo luogo, è una tabella hash (disponibile in V1)

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

In secondo luogo, è un PSObject (più facile in V2)

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

Ti dà più o meno lo stesso oggetto, ma psobjects sono più belli se si desidera ordinare/gruppo/formato/esportarli

+0

Risposta molto buona. +1 – BuddyJoe

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

o più intuitivamente

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