2010-03-05 2 views
6

Работа над сценарием Powershell У меня было несколько мест, где я хотел A, если это не было нулевым, иначе B. По существу это? оператора в C#. Я закончил писать функцию, показанную ниже, но я не могу не думать, что есть встроенный способ сделать это.По умолчанию для нулевых значений

Есть ли лучший, встроенный способ?

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

Я думаю, что это работает лучше:

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

Одна из проблем, с функцией является то, что если вы передаете булевы вы будете иметь неожиданные результаты. Вместо этого следует сравнить $ value -eq $ null. – Josh

+0

Хорошая точка, Джош. – OldFart

+0

В аналогичном вопросе http://stackoverflow.com/questions/10623907/null-coalescing-in-powershell было предложено ($ value, 'default' -ne $ null) [0] в ответе http: // stackoverflow. com/a/17647824/52277 –

ответ

5

Это то, что мы предлагаем в 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&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 
+0

Есть ли что-то, что PSCX не предоставляет? ;) – stej

+0

О да, есть место для новых вещей. :-) –

+0

Я не принимаю этот ответ, потому что я искал что-то, что не требует определения каких-либо новых функций, визуально приятен и чья цель достаточно очевидна для кого-то, читающего сценарий. – OldFart

Смежные вопросы