Thursday, April 14, 2011

How to use PowerShell Get-Member cmdlet

A newbie question:

The command:

[Math] | Get-Member

Returns all members of System.RuntimeType. Why is that?

Also the command:

Get-Member -InputObject [Math]

Returns all members of System.String. If "[Math]" is interpreted as string here, how can I make it a math object?

Also, does Get-member takes any positional parameters? How can I tell?

From stackoverflow
  • Also, does Get-member takes any positional parameters? How can I tell?

    If the parameter name is wrapped in '[]' then the name is optional, so the parameter is positional. For example for Get-Member (definition below), Name is positional but InputObject is not.

    Get-Member [[-Name] ] [-Force] [-InputObject ] [-MemberType {AliasProperty | CodeProperty | Pro perty | NoteProperty | ScriptProperty | Properties | PropertySet | Method | CodeMethod | ScriptMethod | Methods | P arameterizedProperty | MemberSet | Event | All}] [-Static] [-View {Extended | Adapted | Base | All}] []

    For the 1st 2 questions, it seems like you expect them to behave like objects but you are entering a namespace/class. If you do "1 | gm" or "gm -inputobject 1" you will see more like what you want/expect.

  • You are getting a System.RuntimeType from [Math] because that is what it is. It's a Class type as opposed to an object of that particular type. You haven't actually constructed a [Math] object. You will get the same output if you typed:

    [String] | gm
    

    However, if you constructed a string object from the String type, you would get the string members:

    PS C:\> [String]("hi") | gm
    
    
       TypeName: System.String
    
    Name             MemberType            Definition
    ----             ----------            ----------
    Clone            Method                System.Object Clone()
    CompareTo        Method                System.Int32 CompareTo(Object value), System.Int32 CompareTo(String strB)
    Contains         Method                System.Boolean Contains(String value)
    CopyTo           Method                System.Void CopyTo(Int32 sourceIndex, Char[] destination, Int32 destinationIn...
    etc...
    

    Since System.Math has only static members, you can't construct an object of it. To see it's members you can use the GetMembers() function of System.RuntimeType:

    [Math].GetMethods()
    

    You can use one of the format-* cmdlets to format the output:

    [Math].GetMethods() | format-table
    

    Edit: Oh, and I should add, to invoke one of the static members, you would do it like this:

    [Math]::Cos(1.5)
    
  • I just wrote a blog post on exploring static members of classes with PowerShell, which might help.

    What is happening when you pipe [Math] to Get-Member, you are passing in an object of System.RunTimeType, and it does return the members of that type.

    There is a switch parameter for Get-Member which allows you to examine all the static members of a class:

    [Math] | get-member -static
    

    If you need to find instance members, you will need to create an instance of the class and pipe that to Get-Member.

0 comments:

Post a Comment