Get-Method | My-Madness | 2012 PowerShell Scripting Games Beginner Event #2

The details of the event scenario and the design points for Beginner Event #2 of the 2012 PowerShell Scripting Games can be found on the Hey, Scripting Guys! Blog.

Listed below are my notes about the requirements and design points:

Find all services that are running and can be stopped. The command must work against remote computers. Use the simplest command that will work. You do not need to write a script. Return the results to the screen, not to a file. You may use aliases.

I started out by running Get-Service on my local computer:

2012sg-be2-0.png

I then ran Get-Help Get-Service -Full to verify that there weren't any parameters I could use to filter with in an attempt to filter as far to the left as possible which would make the command more efficient. I then piped Get-Service to Get-Member to determine what the available properties were. I determined that there's a property named CanStop along with another named Status. I can see one of the status's in the initial command I ran in the screenshot above is Running, that's one of the pieces to this puzzle.

2012sg-be2-1.png

If I was unsure of what cmdlet to filter with at this point, I could run Get-Help \*filter\* to help me locate the cmdlet. I can see Where-Object is in the results:

2012sg-be2-11.png

There wasn't a way to filter on the Get-Service cmdlet so that means that I'll need to pipe it to the Where-Object cmdlet. Viewing the full help on this cmdlet shows me an example that's similar to part of what I need. The only difference is it filters on Stopped services:

2012sg-be2-12.png

Throw a -and into the script block { } of that example and add another property (CanStop) to filter on. In the case of CanStop, there's no need to test it to see if it's is equal to true or false since a boolean defaults to true. Specifying the ComputerName parameter gives this command a way to be run against remote computers by specifying a remote computer name in place of localhost, an array of computer names in a comma delimited list, or by using (Get-Content C:\filename.txt) to pull the computer names from a text file. You could also pull the computer names from Active Directory by using the Get-ADComputer cmdlet, but that's outside the scope of this scenario.

2012sg-be2-2.png

1Get-Service -ComputerName localhost | Where-Object -FilterScript {$_.Status -eq 'Running' -and $_.CanStop}

µ