6 Stimmen

Standardwerte für Nullwerte

Bei der Arbeit an einem Powershell-Skript hatte ich mehrere Stellen, an denen ich A wollte, es sei denn, es war null, sonst B. Im Wesentlichen der Operator ?? in C#. Am Ende habe ich die unten gezeigte Funktion geschrieben, aber ich denke, es gibt eine integrierte Möglichkeit, dies zu tun.

Gibt es einen besseren, eingebauten Weg?

function Get-ValueOrDefault()
{
    foreach ($value in $args)
    {
        if ($value -ne $null) { return $value }
    }
}

Ich denke, das funktioniert besser:

function Get-ValueOrDefault() { $args | select -first 1 }

5voto

Keith Hill Punkte 183005

Dies bieten wir in der PowerShell-Gemeinschaftserweiterungen :

<#
.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&lt;T&gt; 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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X