Prof. Powershell
Express Yourself with the Invoke-Expression Cmdlet
The Invoke-Expression cmdlet: Turn it on and you can do almost anything.
- By Jeffery Hicks
- 09/21/2010
Windows PowerShell is not too difficult to operate. You type a command and something happens. Usually you are running PowerShell cmdlets, scripts, functions or even non-PowerShell commands like ipconfig.
But maybe you'd like to define a command, and run it later. Or perhaps construct a command on the fly. To run these commands you'll need to turn to the Invoke-Expression cmdlet. Here's a very simple example:
PS C:\> $c="arp -a"
PS C:\> invoke-expression $c
Interface: 192.168.56.1 --- 0x20
Internet Address Physical Address Type
192.168.56.255 ff-ff-ff-ff-ff-ff static
224.0.0.22 01-00-5e-00-00-16 static
224.0.0.252 01-00-5e-00-00-fc static
224.0.1.60 01-00-5e-00-01-3c static
255.255.255.255 ff-ff-ff-ff-ff-ff static
I defined a variable, $c, that contains a command string. Whenever I want to run it, I call Invoke-Expression. You can also use the alias iex. But be careful. Suppose you want to take this expression and save it as a string so you can use Invoke-Expression:
get-service | where {$_.status -eq "Running"}
You'll need to enclose this is single quotes:
PS C:\> $c=' get-service | where {$_.status -eq "Running"}'
PS C:\> iex $c | measure-object
Count : 68
Average :
Sum :
Maximum :
Minimum :
Property :
You can also construct an expression, and include variables:
PS C:\> $c="get-wmiobject"
PS C:\>$c+=' -class $class'
These two statements combine to create the expression get-wmiobject -class $class. This is intentionally a very simple example to make my point. Let's continue:
PS C:\> $class="win32_bios"
PS C:\> iex $c
SMBIOSBIOSVersion : 2ACN21WW
Manufacturer : LENOVO
Name : Rev 1.0
SerialNumber :
Version : LENOVO - 6040000
I can reset $class, and re-invoke $c anytime I want.
PS C:\> $class="win32_computersystem"
PS C:\> iex $c
Domain : WORKGROUP
Manufacturer : LENOVO
Model : S10-3
Name : QUARK
PrimaryOwnerName : Jeff
TotalPhysicalMemory : 2136391680
Finally, you can also pipe one or more expressions to Invoke-Expression, and the cmdlet will execute each one:
PS C:\> "arp -a","nbtstat -n" | iex | out-file c:\work\stats.txt
With this expression I executed two commands and saved the results to a text file.
Most of the time, you know what command you want to run and simply do it. But when you might need to construct a command on the fly or execute something arbitrarily, take a look at Invoke-Expression.
About the Author
Jeffery Hicks is an IT veteran with over 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 is a multi-year recipient of the Microsoft MVP Award in Windows PowerShell. He works today as an independent author, trainer and consultant. Jeff has written for numerous online sites and print publications, is a contributing editor at Petri.com, and a frequent speaker at technology conferences and user groups.