Tips and Tricks

Prof. Powershell: Get Smart and Get -Out

PowerShell cmdlets come well-stocked with common parameters. Let's look at what you can get out of the -OutVariable parameter.

Just about all PowerShell cmdlets support a set of common parameters. These parameters are the same across all cmdlets regardless of the cmdlet's primary parameters -- which is to say the ones you use the most, like -computername. One common parameter you might want to use is -outvariable.

Usually you save a cmdlet's output to a variable like this:

PS C:\> $svc = get-service
This is perfectly acceptable because you likely plan on using $svc later. But you could also create $svc this way using -outvariable:
PS C:\> get-service -outvariable svc 

The only difference is this expression will also write the results to the console. But you'll still have a $svc object. Notice that the name of the variable doesn't need the $. This is because the parameter's value is a variable name and not an object. Here's another way you might use it:

PS C:\> get-service -outvariable svc | where 
	{$_.status -eq "stopped"} -outvariable stopped | 
    Sort Displayname | Select DisplayName
PS C:\> $stopped.count
86
PS C:\> $svc.count
159

This one-line PowerShell expression will produce a sorted list of all stopped services' displaynames, with some added benefits. The results of Get-Service have been saved to $svc. The filtered results from the Where-Object expression have been saved to variable $stopped. Now you can reuse the filtered services variable to work with just stopped services, without having to rerun or retype a long PowerShell command, like this:

PS C:\> $svc | export-
clixml stoppedservices.xml
This is an especially useful technique for long-running commands, where you need information parsed in several ways but don't want to have to rerun a command. Or where the original objects will be lost but you might still need them:
PS C:\> dir d:\files -recurse -outvariable myfiles | 
measure-object length -sum -maximum | 
Select Count,Sum,Maximum

If you want to do more with the files all you have to do is use the $myfiles variable. There's no need to rerun the DIR command, unless you want an updated list:

PS C:\> $myfiles | sort extension | 
   group extension | sort Count -descending | format-table Count,
   Name -autosize
PS C:\> ($myfiles | where {$_.extension -match ".doc"} -outvariable 
   docfiles | measure-object length -sum).sum2809966
PS C:\> $docfiles | Select Fullname

Parameters are all about efficiency. Look at the help file about_CommonParameters for more information.

About the Author

Jeffery Hicks is a multi-year Microsoft MVP in Windows PowerShell, Microsoft Certified Professional and an IT veteran with almost 25 years of experience, much of it spent as an IT infrastructure consultant specializing in Microsoft server technologies with an emphasis in automation and efficiency. He works today as an independent author, trainer and consultant. Jeff is a regular contributor to a variety on online sites, as well as frequent speaker at technology conferences and user groups. Keep up with Jeff and his projects at http://jdhitsolutions.com/blog.

comments powered by Disqus

Redmond Tech Watch

Sign up for our newsletter.

I agree to this site's Privacy Policy.