A great improvement to the new version 3 of PowerShell is the simplification of the Where-Object syntax. Here is an example of the way a Where-Object cmdlet works in v2.
Set-Location "C:\Windows" # Just to give us an interesting place # Old Syntax Get-ChildItem | Where-Object {$_.Length -ge 100kb}
Will produce this output:
Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2/25/2011 12:19 AM 2871808 explorer.exe -a--- 7/13/2009 8:39 PM 733696 HelpPane.exe -a--- 6/3/2012 1:10 PM 649849097 MEMORY.DMP -a--- 7/13/2009 8:39 PM 193536 notepad.exe ----- 3/15/2012 6:07 AM 2693696 PWMBTHLV.EXE -a--- 7/13/2009 8:39 PM 427008 regedit.exe -a--- 12/20/2010 5:11 PM 307712 UltraMon.scr -a--- 3/21/1996 2:00 PM 284160 uninst.exe -a--- 6/4/2012 2:04 PM 1134024 WindowsUpdate.log -a--- 3/8/2012 5:37 PM 302448 WLXPGSS.SCR -a--- 6/10/2009 3:52 PM 316640 WMSysPr9.prx
Version 3 now allows a simplified version of the cmdlet:
Get-ChildItem | Where-Object Length -ge 100kb
With v3 you can now eliminate the script block notation (the {} curly braces), the $_ current object placeholder, as well as the . property notation. Now you can simply enter the name of the property and the condition. It produces the same output as what you see above. You can also use it with variables, or with the question mark as an alias for Where-Object.
$size = 100kb Get-ChildItem | Where-Object Length -ge $size Get-ChildItem | ? Length -ge 100kb
Please note that this new syntax is only valid for simple where clauses. Anytime you have something more complex, such as multiple conditions, you will be required to revert to the v2 $_ syntax.
Warning: This post was created using the PowerShell v3 BETA. Changes between now and the final release may affect the validity of this post.