10

Does the latest version of Powershell have the ability to do something like JavaScript's:

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

If not, what is the equivalent or workaround?

UPDATE
Read all comments

5 Answers 5

14

For simple ways, first, is a hashtable (available in V1)

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

Second, is a PSObject (easier in V2)

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

It gives you roughly the same object, but psobjects are nicer if you want to sort/group/format/export them

Sign up to request clarification or add additional context in comments.

Comments

13

The syntax is not directly supported by the functionality is there via the add-member cmdlet's. Awhile ago, I wrapped this functionality in a general purpose tuple function.

This will give you the ability to one line create these objects.

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

Here is the code for 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 on the subject: http://blogs.msdn.com/jaredpar/archive/2007/11/29/tuples-in-powershell.aspx#comments

Comments

6

Sorry, even though the selected answer is good, I couldn't resist the hacky one line answer:

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

1 Comment

Personally I like the multiassignment syntax: ... | %{$_.x,$_.y,$foo = 12,50,$_ }
3

You can do it like this:

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

Regarding one of your comments elsewhere, custom objects may be more useful than hash tables because they work better with cmdlets that expect objects to have named properties. For example:

$mypoints | Sort-Object y   # mypoints sorted by y-value

Comments

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

or more intuitively

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.