Windows PowerShell $_. Variable

Introduction to the PowerShell Dollar Underscore Variable

Constructions such as ... | Where {$ -Match "win"} are incredibly useful in PowerShell.  Definitions such as: '$_ means in this pipeline', are a bit stuffy.  The best way to understand $_ is to work through examples.

Examples of the PowerShell $_ Variable


PowerShell's $_ Variable

The first point to remember is that $_ is a variable or placeholder. 

# PowerShell $_ Variable Example
Get-Service | Where-Object {$ -Match "win"}

What we want to say here is
Get the services, where the service name matches 'Win'.  Did the repetition of 'service' seem a little verbose?  Well, script writing is brilliant at eliminating extraneous words?

In a nutshell $_ saves us repeating Get-Service, or whatever else may be to the left of ... | Where{$_

The Significance of the Dot in PowerShell's $_.PowerShell Dollar Variable

Here is a similar dollar underscore example but featuring .DisplayName instead of .Name.  My point is I want to illustrate how the .dot command introduces a property.

If you use PowerShell's ISE GUI, then as soon as you type that period (.) you get a drop-down list of properties.

# PowerShell $_ Variable Example
Get-Service | Where {$_.DisplayName -Match "win"}

Challenge:  Research more properties with Get-Service | Get-Member.

$_ Example to Filter WmiObjects

The key to remembering the syntax is to breakdown the construction in to:  $dollar / _underscore /  The commonest example would be: $

# PowerShell script to find Network WMI Objects
Get-WmiObject -List | Where-Object {$ -Match 'Network'}

Note 1: The real-life task is to research for network type WMI objects.  Without the where clause it would be like looking for a needle in a haystack.

Guy Recommends:  A Free Trial of the Network Performance Monitor (NPM)Review of Orion NPM v11.5 v11.5

SolarWinds' Network Performance Monitor will help you discover what's happening on your network.  This utility will also guide you through troubleshooting; the dashboard will indicate whether the root cause is a broken link, faulty equipment or resource overload.

What I like best is the way NPM suggests solutions to network problems.  Its also has the ability to monitor the health of individual VMware virtual machines.  If you are interested in troubleshooting, and creating network maps, then I recommend that you try NPM now.

Download a free trial of Solarwinds' Network Performance Monitor

 The PowerShell Variable $_

Another way of looking at PowerShell's $_ is purely as a variable.  After all, the dollar sign is PowerShell's way of introducing any variable, not just this special 'In this pipeline' item.

#PowerShell Script to List Dll files
$Path = "C:\Windows\System32\"
Get-ChildItem $Path | Where {$_.extension -eq '.DLL'}

Note 2: The point of this example is to compare the special $_ variable with an ordinary variable called $Path.

Significance of the Where {Evaluation}

Most of the $_ examples feature the 'where' filter.  While many scripters also like the alias ?, the underlying cmdlet is: Where-Object.  Let us take the time to research its properties.

Get-Help Where-Object -full

Note 3: Remember that Where-Object is a filter; therefore to perform its job Where needs a ScriptBlock to evaluate the test.  Actually, the two characters '$ and _' play a small but important role; $_'s job is to shorten the evaluation by saying, 'In this pipeline', rather than explicitly mentioning the test for a second time.

See more on measuring the speed of Where-Object

PowerShell $_ with ForEach

Most of my $_ examples are found in Where-Object clauses, but here is a different use for this special pipeline variable: ForEach.  Once again, observe that $_ is the first item inside the curly brackets, but this time the underscore is followed by the -replace parameter rather than a .property.

The purpose of this script is to remove and duplicate "the the" in documents stored in the ProofRead folder.

$file = gci "D:\ProofRead\*.doc"
ForEach ($str in $file)
$cont = Get-Content -path $str
$cont | ForEach {$_ -replace "the , "the"} | Set-Content $str

Note 4: In the ForEach example the syntax is purely $_ there is no (.) property.

Guy Recommends: Free WMI Monitor for PowerShellSolarwinds Free WMI Monitor for PowerShell

Windows Management Instrumentation (WMI) is one of the hidden treasures of Microsoft's operating systems.  Fortunately, SolarWinds have created a Free WMI Monitor so that you can discover these gems of performance information, and thus improve your PowerShell scripts.

Take the guess work out of which WMI counters to use when scripting the operating system, Active Directory, or Exchange Server. Give this WMI monitor a try - it's free.

Download your free copy of WMI Monitor

More of PowerShell's Built-In Variables

You can enumerate PowerShell's variables with this command:

Get-Variable | Format-Table name, value -auto

Variable Name Description
$_ The current pipeline object; used in script blocks, filters, the process clause of functions, where-object, ForEach-object and switch
$Args  Used in creating functions that require parameters
$Env:Path Environmental Path to files.
$Error  If an error occurred, the object is saved in the $error PowerShell variable
$ForEach Refers to the enumerator in a ForEach loop.
$HOME The user's home directory; set to %HOMEDRIVE%\%HOMEPATH%
$Input Input piped to a function or code block
$Match A hash table consisting of items found by the -Match operator.
$Host Information about the currently executing host
$LastExitCode The exit code of the last native application to run
$true Boolean TRUE
$false Boolean FALSE
$null A null object
$ShellID The identifier for the shell.  This value is used by the shell to determine the ExecutionPolicy and what profiles are run at startup.
$StackTrace  contains detailed stack trace information about the last error

See also PowerShell's Get-PSProvider ยป

Summary of PowerShell $_ Variable

Perhaps the key to understanding this construction is to look at what follows $_.  For example, $_.Name leads us to think, 'Name is a property in the current ScriptBlock, or PowerShell pipeline.  Further reflection shows that $_ saves scripting space by substituting two characters for a whole extra construction.

If you like this page then please share it with your friends


See more Windows PowerShell  examples of variables

Syntax   • PowerShell Variables   • Get-PSProvider   • PowerShell Dollar Variable

PowerShell Functions   • Get-PSDrive   • PowerShell New-PSDrive   • Remove-PSDrive

PowerShell Home   • Foreach loops   • PowerShell Foreach   • Foreach-Object cmdlet

Please email me if you have a better example script.  Also please report any factual mistakes, grammatical errors or broken links, I will be happy to  correct the fault.



Custom Search

Site Home

Guy Recommends: WMI Monitor for PowershellSolarwinds WMI Monitor

Windows Management Instrumentation (WMI) is most useful for PowerShell scripting.

SolarWinds have produced this Free WMI Monitor to take the guess work out of which WMI counters to use for applications like Microsoft Active Directory, SQL or Exchange Server.

Download your free copy of WMI Monitor

Author: Guy Thomas Copyright © 1999-2017 Computer Performance LTD All rights reserved.

Please report a broken link, or an error to: