2010-03-05 35 views
6

Bir Powershell betiği üzerinde çalışıyorum N'yi istemediğim birkaç yerim vardı, boş değilse, B hariç. C# operatöründe. Aşağıda gösterilen işlevi yazmayı bitirdim, ancak yardım edemem ama bunun için yerleşik bir yol olduğunu düşünüyorum.Boş değerler için varsayılan değerler

Daha iyi, yerleşik bir yol var mı?

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

bu daha iyi çalışır düşünüyorum:

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

Bir sorun Boolean geçmesi durumunda gerekecek olmasıdır beklenmedik sonuçlar. Bunun yerine $ value -eq $ null değerini karşılaştırmalı. – Josh

+0

İyi nokta, Josh. – OldFart

+0

Benzer bir soruda http://stackoverflow.com/questions/10623907/null-coalescing-in-powershell http: // stackoverflow yanıtında önerildi ($ value, 'default' -ne $ null) [0]. com/a/17647824/52277 –

cevap

5

Biz verdiğimiz budur PowerShell Community Extensions:

sizin fonksiyonu ile
<# 
.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'in sağlamadığı bir şey var mı? ;) – stej

+0

Oh evet, yeni şeyler için yer var. :-) –

+0

Bu cevabı kabul etmiyorum çünkü yeni işlevleri tanımlamak, görsel olarak memnun olmak ve amacı senaryoyu okuyan biri için oldukça açık olan bir şey arıyordum. – OldFart

İlgili konular