50

I want to create an object of arbitrary values, sort of like how I can do this in C#

var anon = new { Name = "Ted", Age = 10 };

3 Answers 3

63

You can do any of the following, in order of easiest usage:

  1. Use Vanilla Hashtable with PowerShell 5+

    In PS5, a vanilla hash table will work for most use cases

    $o = @{ Name = "Ted"; Age = 10 }
    

  2. Convert Hashtable to PSCustomObject

    If you don't have a strong preference, just use this where vanilla hash tables won't work:

    $o = [pscustomobject]@{
        Name = "Ted";
        Age = 10
    }
    

  3. Using Select-Object cmdlet

    $o = Select-Object @{n='Name';e={'Ted'}},
                       @{n='Age';e={10}} `
                       -InputObject ''
    

  4. Using New-Object and Add-Member

    $o = New-Object -TypeName psobject
    $o | Add-Member -MemberType NoteProperty -Name Name -Value 'Ted'
    $o | Add-Member -MemberType NoteProperty -Name Age -Value 10
    

  5. Using New-Object and hashtables

    $properties = @{
        Name = "Ted";
        Age = 10
    }
    $o = New-Object psobject -Property $properties;
    

Note: Objects vs. HashTables

Hashtables are just dictionaries containing keys and values, meaning you might not get the expected results from other PS functions that look for objects and properties:

$o = @{ Name="Ted"; Age= 10; }
$o | Select -Property *

Further Reading

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

Comments

35

Try this:

PS Z:\> $o = @{}
PS Z:\> $o.Name = "Ted"
PS Z:\> $o.Age = 10

Note: You can also include this object as the -Body of an Invoke-RestMethod and it'll serialize it with no extra work.

Update

Note the comments below. This creates a hashtable.

7 Comments

I like do it like this: $o = [ordered]@{ Name = "Ted"; Age = 10 }
@CB. might want to clarify what [ordered] is for in that instance.
The "[ordered]" is a type accelerator; it's new as of PowerShell 3.0. It's just saying the thing to the right is an OrderedDictionary. You don't need it, but it's nice.
It's not custom object. It's a hashtable, check this $o.GetType() out. And in strict PS mode it won't work, only $o['Name'].
PLEASE beware that the answer by prampe shows how to do this in almost the exact same syntax the OP hoped for: $anon = @{ Name="Ted"; Age= 10; }. This is possible from PowerShell 5 upwards.
|
7

With PowerShell 5+ Just declare as:

    $anon = @{ Name="Ted"; Age= 10; }

Example

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.