Many unix/linux users are intimately familiar with regular expressions and using them with grep, sed or awk in a pipeline. A typical usage scenario is the following command:
ls | grep -i '.*[0-9].*\.dll' | sort
So how do we do grep in PowerShell? Well, we can use PowerShell’s operators:
| Operator | Description |
|---|---|
| -match | Matches its input property agains a regular expression. By default Powershell uses case-insensitive matching. Thats different than .Net’s default behavior with the RegEx class |
| -imatch | Case-insensitive version of Match |
| -cmatch | Case-sensitive version of Match |
| -like | This compares its input against a string that can contain a wildcard. So no regular expressions usable here |
| -contains | Only tells you if the input does or doesn’t contain the exact value you supplied |
For our specific example, the PowerShell equivalent is:
Get-ChildItem | where { $_.Name -match ".*[0-9].*\.dll" } | Sort-Object -Property Name
And gives us the following output:
Directory: C:\Windows\System32
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 20-11-2010 22:29 640512 advapi32.dll
-a--- 11-6-2011 3:58 138056 atl100.dll
-a--- 14-7-2009 3:14 65024 avicap32.dll
-a--- 20-11-2010 22:29 91648 avifil32.dll
-a--- 14-7-2009 3:14 10752 bitsprx2.dll
...
...
Another approach is to directly use the RegEx class from .Net. An example:
$matchOptions = [System.Text.RegularExpressions.RegexOptions]::IgnoreCase
$matcher = new-object System.Text.RegularExpressions.Regex (".*[0-9].*\.dll",$matchOptions)
$files = Get-ChildItem
$files | where { $matcher.IsMatch($_.Name) }