My Approach to the 2012 PowerShell Scripting Games Beginner Event #1

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

Computers run Windows 7 and servers run Windows 2008 R2. They’re all in one domain. PowerShell remoting is enabled on all computers (both servers and desktops). Use PowerShell to retrieve the top ten processes based on the memory working set. There’s no need to write a script. The command can be a one liner. You can use aliases. The command must be capable of running remotely against other domain computers. Your command should return an object. You should be able to write the results to a file if required.

I know I'll have to use Get-Process so I started out by just running that cmdlet on my local computer with no parameters to determine what results are returned by default:

2012sg-be1-1.png

I want the top ten results based off of Working Set. I initially missed this and sorted by Virtual Memory. The screenshot included in the requirement details for event #1 on the Scripting Games site clued me into re-reading the requirements again and catching this. Take your time and read thoroughly. WS(K) is probably the Working Set, but let’s pipe Get-Process to Get-Member to see what the available properties are:

2012sg-be1-21.png

I can see that WS is an alias to a property named WorkingSet. I’ll use the property WorkingSet since I’ve always heard if you're providing a command or script to someone else that you shouldn’t use aliases.

In order to get the top ten processes based on WorkingSet, I’ll need to first sort by that property in descending order. Pipe Get-Process to Sort-Object to accomplish that. My first sort was in exactly the wrong order so I ran Get-Help Sort-Object -Full and determined that there was a Descending parameter that would sort as required.

2012sg-be1-3.png

Now that I have it sorted correctly, I can select the first (top) ten. Pipe Sort-Object to Select-Object. Run Get-Help Select-Object -Full to determine what the available parameters are. There's a First parameter and specifying 10 meets the requirements.

2012sg-be1-4.png

I have what I need as far as the local computer goes. I could simply run it against remote computers using the ComputerName parameter of Get-Process, but I couldn’t resist using PowerShell remoting since the scenario stated it was enabled on all computers.

2012sg-be1-5.png

Using PowerShell remoting also gives me a column that tells me what computer the results are from where using the ComputerName parameter of Get-Process wouldn’t and the results wouldn’t mean much if it was run against multiple computers.

1Invoke-Command -ComputerName localhost {Get-Process | Sort-Object WorkingSet -Descending | Select-Object -First 10}

Something that was confusing to me about this particular event was that the command should return an object and another point was writing the results to a file. If you add the code to pipe this to a file doesn't that keep it from outputting an object?

µ