Diff Get-ChildItem | Get-Member (and) Get-Member -inputObject Get-ChildItem

Can someone explain like I’m five the difference between those 2 commands:

1- Get-ChildItem | Get-Member
2- Get-Member -inputObject Get-ChildItem

The results of the commands are not the same.

Command1 output TypeName: System.IO.DirectoryInfo properties and methods of Get-ChildItem objects.

Command2 output TypeName: System.String

Then I tried to get more information via help :

Get-Help Get-Member -parameter inputObject

-InputObject []
Specifies the object whose members are retrieved.

Using the InputObject parameter is not the same as piping an object to Get-Member. The differences are as follows:

-- When you pipe a collection of objects to Get-Member, Get-Member gets the members of the individual objects in the collection, such as the properties of each string in an array of strings.

-- When you use InputObject to submit a collection of objects, Get-Member gets the members of the collection, such as the properties of the array in an array of strings.

This is Chinese for me … I don’t get it.

The different is the object that is being evaluated by the get-member cmdlet

When you run the the get-childitem cmdlet, it returns objects of type System.IO.DirectoryInfo. When you pipe get-childitem to get-member

get-childitem | get-member

get-childitem is outputing System.IO.DirectoryInfo object to the pipeline, then get-member is getting System.IO.DirectoryInfo objects from the pipeline as the inputobject. That is why you get the System.IO.DirectoryInfo type information as a result of the get-member cmdlet

When you use get-childitem as inputobject in the following manner.

get-member -inputobject get-childitem

Powershell does not execute get-childitem, it simply passes it in as a string so you get the member info for a System.String

The same thing happens if you use a variable:

$children = get-childitem
$children | get-member

The result of the above is the same as doing get-childitem | get-member. The System.IO.DirectoryInfo object stored in the $children variable are output to the pipeline. Then get-member gets System.IO.DirectoryInfo objects as input

When you put the variable itself as the input object however:

$children = get-childitem
get-member -InputObject $children

The result is the members of type System.Object[]. This is because get-member is looking at the $children variable itself, not what is stored in the variable.

Excellent reply. TYVM. :smiley: