Skip to content

Instantly share code, notes, and snippets.

@cdhunt cdhunt/Maybe.ps1
Last active Jan 10, 2017

Embed
What would you like to do?
Messing around with a filter function that is a mashup of Where-Object and If/Then. It might be a solution looking for a problem, but it's also fairly versatile. Do you see any value in it?
function Where-ObjectMaybe
{
[CmdletBinding(DefaultParameterSetName='Just')]
[Alias('Maybe')]
Param
(
[Parameter(ValueFromPipeline=$true,
Position=4)]
$InputObject,
[Parameter(Position=0)]
[Type]
$Type,
[Parameter(ParameterSetName='Just', Position=1)]
[object]
$Just,
[Parameter(ParameterSetName='Of', Position=1)]
[object[]]
$Of,
[Parameter(ParameterSetName='FilterScript', Position=2)]
[ScriptBlock]
$FilterScript,
[Parameter(ParameterSetName='Just', Position=3)]
[Parameter(ParameterSetName='Of', Position=3)]
[Parameter(ParameterSetName='FilterScript', Position=3)]
[object]
$OtherWise
)
Begin
{
$yesMaybe = $false
}
Process
{
foreach ($i in $InputObject)
{
if ($PSBoundParameters.ContainsKey('Type') -and $PSBoundParameters.ContainsKey('Just'))
{
if ($i -is $Type -and $i -eq $Just) {
Write-Output -InputObject $i
$yesMaybe = $true
}
}
elseif ($PSBoundParameters.ContainsKey('Just'))
{
if ($i -eq $Just) {
Write-Output -InputObject $i
$yesMaybe = $true
}
}
elseif ($PSBoundParameters.ContainsKey('Type') -and $PSBoundParameters.ContainsKey('Of'))
{
if ($i -is $Type -and $Of -contains $i) {
Write-Output -InputObject $i
$yesMaybe = $true
}
}
elseif ($PSBoundParameters.ContainsKey('Of'))
{
if ($Of -contains $i) {
Write-Output -InputObject $i
$yesMaybe = $true
}
}
elseif ($PSBoundParameters.ContainsKey('Type') -and $PSBoundParameters.ContainsKey('FilterScript'))
{
if ($i -is $Type -and $FilterScript.InvokeWithContext($null, (New-Object PSVariable @('_', $i)), $null)) {
Write-Output -InputObject $i
$yesMaybe = $true
}
}
elseif ($PSBoundParameters.ContainsKey('FilterScript'))
{
if ($FilterScript.InvokeWithContext($null, (New-Object PSVariable @('_', $i)), $null)) {
Write-Output -InputObject $i
$yesMaybe = $true
}
}
elseif ($PSBoundParameters.ContainsKey('Type'))
{
if ($i -is $Type) {
Write-Output -InputObject $i
$yesMaybe = $true
}
}
}
}
End
{
if ($PSBoundParameters.ContainsKey('OtherWise') -and -not $yesMaybe)
{
Write-Output -InputObject $OtherWise
}
}
}
Write-Host '1 | maybe -Just 1' -ForegroundColor Yellow
1 | Maybe -Just 1
Write-Host '1 | maybe -Just 2' -ForegroundColor Yellow
1 | Maybe -Just 2
Write-Host '1 | maybe -Just 2 -OtherWise -1' -ForegroundColor Yellow
1 | Maybe -Just 2 -OtherWise -1
Write-Host 'echo 1 2 3 | Maybe -Just 4 -OtherWise $false' -ForegroundColor Yellow
echo 1 2 3 | Maybe -Just 4 -OtherWise $false
Write-Host '1 | maybe int -OtherWise -1' -ForegroundColor Yellow
1 | Maybe int -OtherWise -1
Write-Host "'string' | maybe int -OtherWise -1" -ForegroundColor Yellow
'string' | Maybe int -OtherWise -1
Write-Host '$null | maybe int' -ForegroundColor Yellow
$null | Maybe -just int
Write-Host '$null | maybe int -OtherWise 0' -ForegroundColor Yellow
$null | Maybe int -OtherWise 0
Write-Host '$null | Maybe -OtherWise $false' -ForegroundColor Yellow
$null | Maybe -OtherWise $false
Write-Host 'echo 1 2 3 | Maybe -Of @(1,2)' -ForegroundColor Yellow
echo 1 2 3 | Maybe -Of @(1,2)
Write-Host 'echo 1 2 b | Maybe -Of @(1,"b")' -ForegroundColor Yellow
echo 1 2 b | Maybe -Of @(1,'b')
Write-Host 'echo 1 2 b | Maybe int' -ForegroundColor Yellow
echo 1 2 b | Maybe int
Write-Host 'echo 1 2 b | Maybe int -of @(2,3)' -ForegroundColor Yellow
echo 1 2 b | Maybe int -of @(2,3)
Write-Host 'echo 1 2 3 | Maybe -Of @(4,5) -OtherWise @()' -ForegroundColor Yellow
$array = echo 1 2 3 | Maybe -Of @(4,5) -OtherWise @()
$array.count
Write-Host "Get-Process | Maybe -FilterScript {$_.Name -eq 'PowerShell'} -OtherWise 'No instance of PowerShell is running'" -ForegroundColor Yellow
Get-Process | Maybe -FilterScript {$_.Name -eq 'PowerShell'} -OtherWise 'No instance of PowerShell is running'
Write-Host "Get-Process | Maybe -FilterScript {$_.Name -eq 'NotARealProcess'} -OtherWise 'No instance of NotARealProcess is running'" -ForegroundColor Yellow
Get-Process | Maybe -FilterScript {$_.Name -eq 'NotARealProcess'} -OtherWise 'No instance of NotARealProcess is running'
PS> 1 | maybe -Just 1
1
PS> 1 | maybe -Just 2
PS> 1 | maybe -Just 2 -OtherWise -1
-1
PS> echo 1 2 3 | Maybe -Just 4 -OtherWise $false
False
PS> 1 | maybe int -OtherWise -1
1
PS> 'string' | maybe int -OtherWise -1
-1
PS> $null | maybe int
PS> $null | maybe int -OtherWise 0
0
PS> $null | Maybe -OtherWise $false
False
PS> echo 1 2 3 | Maybe -Of @(1,2)
1
2
PS> echo 1 2 b | Maybe -Of @(1,"b")
1
b
PS> echo 1 2 b | Maybe int
1
2
PS> echo 1 2 b | Maybe int -of @(2,3)
2
PS> echo 1 2 3 | Maybe -Of @(4,5) -OtherWise @()
0
PS> Get-Process | Maybe -FilterScript {.Name -eq 'PowerShell'} -OtherWise 'No instance of PowerShell is running'
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
1406 63 274732 4248 27.31 1112 1 powershell
616 36 77100 16344 9.73 5080 1 powershell
757 40 118064 56484 3.13 38680 1 powershell
PS> Get-Process | Maybe -FilterScript {.Name -eq 'NotARealProcess'} -OtherWise 'No instance of NotARealProcess is running'
No instance of NotARealProcess is running
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.