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) }