[powershell] PowerShell의 삼항 연산자

내가 아는 바에 따르면 PowerShell에는 소위 삼항 연산자에 대한 기본 제공식이없는 것 같습니다 .

예를 들어, 삼항 연산자를 지원하는 C 언어에서는 다음과 같이 작성할 수 있습니다.

<condition> ? <condition-is-true> : <condition-is-false>;

이것이 PowerShell에 실제로 존재하지 않는다면 동일한 결과를 달성하는 가장 좋은 방법은 무엇입니까 (즉, 읽고 유지 관리하기 쉬운가)?



답변

$result = If ($condition) {"true"} Else {"false"}

그 밖의 모든 것은 부수적으로 복잡하므로 피해야합니다.

할당뿐만 아니라 표현식으로 또는 표현식으로 사용하려면 다음과 같이 묶으십시오 $().

write-host  $(If ($condition) {"true"} Else {"false"}) 


답변

에뮬레이션하기 위해 내가 찾은 가장 가까운 PowerShell 구성은 다음과 같습니다.

@({'condition is false'},{'condition is true'})[$condition]


답변

Powershell 7에 있습니다. https://toastit.dev/2019/09/25/ternary-operator-powershell-7/

PS C:\Users\js> 0 ? 'yes' : 'no'
no
PS C:\Users\js> 1 ? 'yes' : 'no'
yes


답변

PowerShell 블로그 게시물 에 따라 ?:운영자 를 정의하는 별칭을 만들 수 있습니다 .

set-alias ?: Invoke-Ternary -Option AllScope -Description "PSCX filter alias"
filter Invoke-Ternary ([scriptblock]$decider, [scriptblock]$ifTrue, [scriptblock]$ifFalse)
{
   if (&$decider) {
      &$ifTrue
   } else {
      &$ifFalse
   }
}

다음과 같이 사용하십시오.

$total = ($quantity * $price ) * (?:  {$quantity -le 10} {.9} {.75})


답변

나도 더 나은 답변을 찾고 Edward의 게시물에있는 해결책이 “ok”인 동안이 블로그 게시물에 훨씬 더 자연스러운 해결책을 찾았 습니다.

짧고 달다:

# ---------------------------------------------------------------------------
# Name:   Invoke-Assignment
# Alias:  =
# Author: Garrett Serack (@FearTheCowboy)
# Desc:   Enables expressions like the C# operators: 
#         Ternary: 
#             <condition> ? <trueresult> : <falseresult> 
#             e.g. 
#                status = (age > 50) ? "old" : "young";
#         Null-Coalescing 
#             <value> ?? <value-if-value-is-null>
#             e.g.
#                name = GetName() ?? "No Name";
#             
# Ternary Usage:  
#         $status == ($age > 50) ? "old" : "young"
#
# Null Coalescing Usage:
#         $name = (get-name) ? "No Name" 
# ---------------------------------------------------------------------------

# returns the evaluated value of the parameter passed in, 
# executing it, if it is a scriptblock   
function eval($item) {
    if( $item -ne $null ) {
        if( $item -is "ScriptBlock" ) {
            return & $item
        }
        return $item
    }
    return $null
}

# an extended assignment function; implements logic for Ternarys and Null-Coalescing expressions
function Invoke-Assignment {
    if( $args ) {
        # ternary
        if ($p = [array]::IndexOf($args,'?' )+1) {
            if (eval($args[0])) {
                return eval($args[$p])
            }
            return eval($args[([array]::IndexOf($args,':',$p))+1])
        }

        # null-coalescing
        if ($p = ([array]::IndexOf($args,'??',$p)+1)) {
            if ($result = eval($args[0])) {
                return $result
            }
            return eval($args[$p])
        }

        # neither ternary or null-coalescing, just a value  
        return eval($args[0])
    }
    return $null
}

# alias the function to the equals sign (which doesn't impede the normal use of = )
set-alias = Invoke-Assignment -Option AllScope -Description "FearTheCowboy's Invoke-Assignment."

다음과 같은 작업을 쉽게 수행 할 수 있습니다 (블로그 게시물의 더 많은 예).

$message == ($age > 50) ? "Old Man" :"Young Dude" 


답변

Powershell의 switch 문을 대안으로 사용하십시오. 특히 변수 할당-여러 줄이지 만 읽을 수 있습니다.

예,

$WinVer = switch ( Test-Path $Env:windir\SysWOW64 ) {
  $true    { "64-bit" }
  $false   { "32-bit" }
}
"This version of Windows is $WinVer"


답변

삼항 연산자는 일반적으로 값을 지정할 때 사용되므로 값을 반환해야합니다. 이것이 작동하는 방법입니다.

$var=@("value if false","value if true")[[byte](condition)]

멍청하지만 작동합니다. 또한이 구성을 사용하여 int를 다른 값으로 빠르게 바꿀 수 있습니다. 배열 요소를 추가하고 0부터 시작하는 음이 아닌 값을 반환하는 식을 지정하십시오.