Filtering in Powershell are one of the most expressions i’m use for drill down get-cmdlet results. There are so much situations we wouldlike to have some simple and clear technique to see the results in different views.As an Example I will use get-process with three views:
- SlowMotion (More about here.)
- Startet Services
- Stopped Services who begins with “VW*”
The most scripts are using one view per File:
1
Get-ServicesByStopped.ps1 | Get-ServicesInSlowMotion.ps1
The scripts above are displaying two different views. This will give you very fast a big collection of files.
One other approach is display views over Parameters. Maybe you will use
1
.\Get-MyProcesses.ps1 –ReportByVMWareStopped
Example 1:
Using filters dynamic is getting scripting simple to extend and flexible to use.
Basicly I create a few lines that do the following:
- First normaly create filters in the Syntax “filter Filter-xxx{…}”. This is the best Advantage because just define the filter und you will get the selection for the filter in your Script.
- Load the filters when its needed from the Function Provider
- Display the avaible filters so that the user can choose the right one.
- Load the definition and show the result as selected.
Example: Dynamic Filters
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
## Creating the Filters
filter Filter-VMWare-Stopped{if($_.Status -eq "Stopped" -and $_.Name -ilike "VM*"){$_}}
filter Filter-Startet{if($_.Status -eq "Startet"){$_}}
filter Filter-SlowMotion{$_; Start-Sleep -milliseconds 500}
## Get All Filters by Name (Scoped filters need some Cleanups)
$filterobjects = & get-childitem function: | ?{$_.CommandType -eq 'Filter'}
$filterobjects | ft name
$choosedFilter = read-host "`nChoose your Filter"
## Choose the filter Definition (For the Filter-Stopped it will contain if($_.Status -eq "Stopped"){$_})
$choosedFilterDefinition = (get-item function:$choosedFilter).Definition
## The Where-Object need's a Scriptblock.
$currentFilter = [scriptblock]::Create($choosedFilterDefinition)
get-service | where-object $currentFilter | ft -autosize Name, Status, DisplayName