Работа над сценарием Powershell, у меня было несколько мест, где я хотел, если это не было пустым, еще B. По существу?? оператор в C#. Я закончил тем, что писал функцию, показанную ниже, но я не могу не думать, что существует встроенный способ сделать это.
Существует ли лучшее, встроенное, путь?
function Get-ValueOrDefault()
{
foreach ($value in $args)
{
if ($value -ne $null) { return $value }
}
}
Я думаю, что это работает лучше:
function Get-ValueOrDefault() { $args | select -first 1 }
Вот что мы предоставляем в PowerShell Community Extensions:
<#
.SYNOPSIS
Similar to the C# ?? operator e.g. name = value ?? String.Empty
.DESCRIPTION
Similar to the C# ?? operator e.g. name = value ?? String.Empty;
where value would be a Nullable<T> in C#. Even though PowerShell
doesn't support nullables yet we can approximate this behavior.
In the example below, $LogDir will be assigned the value of $env:LogDir
if it exists and it's not null, otherwise it get's assigned the
result of the second script block (C:\Windows\System32\LogFiles).
This behavior is also analogous to Korn shell assignments of this form:
LogDir = ${$LogDir:-$WinDir/System32/LogFiles}
.PARAMETER PrimaryExpr
The condition that determines whether the TrueBlock scriptblock is used or the FalseBlock
is used.
.PARAMETER AlternateExpr
This block gets evaluated and its contents are returned from the function if the Conditon
scriptblock evaluates to $true.
.EXAMPLE
C:\PS> $LogDir = ?? {$env:LogDir} {"$env:windir\System32\LogFiles"}
$LogDir is set to the value of $env:LogDir unless it doesn't exist, in which case it
will then default to "$env:windir\System32\LogFiles".
#>
filter Invoke-NullCoalescing {
param([scriptblock]$PrimaryExpr = $(throw "Parameter '-primaryExpr' (position 1) required"),
[scriptblock]$AlternateExpr = $(throw "Parameter '-alternateExpr' (position 2) required"))
if ($primaryExpr -ne $null) {
$result = &$primaryExpr
if ($result -ne $null -and "$result" -ne '') {
$result
}
else {
&$alternateExpr
}
}
else {
&$alternateExpr
}
}
New-Alias ?? Invoke-NullCoalescing
PS> ?? {$xyzzy} {"empty"}
empty
PS> ?? {$psversiontable} {"empty"}
Name Value
---- -----
CLRVersion 2.0.50727.4927
BuildVersion 6.1.7600.16385
PSVersion 2.0
WSManStackVersion 2.0
PSCompatibleVersions {1.0, 2.0}
SerializationVersion 1.1.0.1
PSRemotingProtocolVersion 2.1