Powershell – Manipulating objects to pass them along the pipeline

Before getting into this, I’d like to discuss the pipeline a bit. In the pipeline you have to ways of passing objects, by value (typename) or by property name (which is powershell’s second try)

 

For example, let’s see what kind of objects get-process creates by piping get-member to it (I use the alias GM)

 

img 5666402288874

Now you could pipe objects from get-process to stop-process because stop-process takes input objects by the typename system.diagnostics.process.

We can verify this by simply reading the full help.

 

img 5666406c15f72

Now if we did get-process -name notepad | stop-process

The object notepad which is of the type system.diagnostics.process get’s piped into stop-process, it gets piped into this parameter, which takes input by value.

img 5666410ca1554

Notice how in the syntax below we can see that inputobject is optional, because it’s a placeholder for process, which takes multiple objects (I know this because it says [] inside of process, which means multiple objects…

img 5666413d35abf

So now if we want to know what would happen if passed the object to stop-process, we would run a -whatif

img 5666417e5d1b8

Now stop-process has parameters for doing this much faster, however I find that using this command makes it much easier to explain what is happening and how objects are being passed through the pipeline.

 

img 566641c6ab12a

 

The above command would accomplish the same thing, however it uses a parameter to filter the objects rather then getting them from the pipeline. Which makes the above command much faster to run than piping objects into stop-process.

(powershell tip : formatting should always be kept to the left as much as possible).

 

Now I’m going to show you how we can accomplish the same things but instead this time we will pass objects of the type system.string and powershell will match them via their propertyname and input them into the parameter that takes input from pipeline by property name.

 

img 5666426256da1

 

I notice in the help file that -name takes input from the pipeline by property name. Now you should know that properties are the column headers in collections (collections are a set of objects)

img 566642dc6a530

In the above screenshot we see that the column header is name, and this is a property. So now recall that -name from stop-process takes input from pipeline by propertyname. It just so happens that I created a hashtable with a property of name, and now the parameter and the property match! Now powershell can see this connection and take this input!

 

I created this hashtable with this command…

 

img 5666432f47788

In the above I created a custom powershell object, then created a hash table, the property is the first value you see ‘name’, and the second string is what’s put into the rows under the column of the property name. So this single object above has a value of ‘notepad’ and a property of name.

The same can be accomplished with

img 566644a451e96

Now since we have a hash table with the property ‘name’ powershell can reference this and put it into stop-process’ -name parameter, and since it finds objects with that property name, it will try to stop them!

img 5666438b22c41

BAM!!!

Now you know how to manipulate strings and objects to force them into parameters in the next command via the pipeline!

Leave a comment