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 블로그 게시물 에 따라 ?:
운영자 를 정의하는 별칭을 만들 수 있습니다 .
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부터 시작하는 음이 아닌 값을 반환하는 식을 지정하십시오.
I've recently improved (open PullRequest) the ternary conditional and null-coalescing operators in the PoweShell lib 'Pscx'
Pls have a look for my solution.
My github topic branch: UtilityModule_Invoke-Operators
Functions:
Invoke-Ternary
Invoke-TernaryAsPipe
Invoke-NullCoalescing
NullCoalescingAsPipe
Aliases
Set-Alias :?: Pscx\Invoke-Ternary -Description "PSCX alias"
Set-Alias ?: Pscx\Invoke-TernaryAsPipe -Description "PSCX alias"
Set-Alias :?? Pscx\Invoke-NullCoalescing -Description "PSCX alias"
Set-Alias ?? Pscx\Invoke-NullCoalescingAsPipe -Description "PSCX alias"
Usage
<condition_expression> |?: <true_expression> <false_expression>
<variable_expression> |?? <alternate_expression>
As expression you can pass:
$null, a literal, a variable, an 'external' expression ($b -eq 4) or a scriptblock {$b -eq 4}
If a variable in the variable expression is $null or not existing, the alternate expression is evaluated as output.
Since I have used this many times already and didn't see it listed here, I'll add my piece :
$var = @{$true="this is true";$false="this is false"}[1 -eq 1]
ugliest of all !
PowerShell에는 현재 기본 인라인 If (또는 삼항 If )가 없지만 사용자 지정 cmdlet을 사용하는 것이 좋습니다.
IIf <condition> <condition-is-true> <condition-is-false>
참고 :
PowerShell 인라인 If (IIf)
대체 사용자 정의 함수 접근 방식은 다음과 같습니다.
function Test-TernaryOperatorCondition {
[CmdletBinding()]
param (
[Parameter(ValueFromPipeline = $true, Mandatory = $true)]
[bool]$ConditionResult
,
[Parameter(Mandatory = $true, Position = 0)]
[PSObject]$ValueIfTrue
,
[Parameter(Mandatory = $true, Position = 1)]
[ValidateSet(':')]
[char]$Colon
,
[Parameter(Mandatory = $true, Position = 2)]
[PSObject]$ValueIfFalse
)
process {
if ($ConditionResult) {
$ValueIfTrue
}
else {
$ValueIfFalse
}
}
}
set-alias -Name '???' -Value 'Test-TernaryOperatorCondition'
예
1 -eq 1 |??? 'match' : 'nomatch'
1 -eq 2 |??? 'match' : 'nomatch'
차이점 설명
- 왜 1이 아닌 3 개의 물음표입니까?
?
문자는 이미 별칭입니다Where-Object
.??
다른 언어에서는 null 병합 연산자로 사용되며 혼란을 피하고 싶었습니다.
- 명령 전에 파이프가 필요한 이유는 무엇입니까?
- 파이프 라인을 사용하여이를 평가하므로 조건을 함수에 파이프하려면 여전히이 문자가 필요합니다.
- 배열을 전달하면 어떻게됩니까?
- We get a result for each value; i.e.
-2..2 |??? 'match' : 'nomatch'
gives:match, match, nomatch, match, match
(i.e. since any non-zero int evaluates totrue
; whilst zero evaluates tofalse
). - If you don't want that, convert the array to a bool;
([bool](-2..2)) |??? 'match' : 'nomatch'
(or simply:[bool](-2..2) |??? 'match' : 'nomatch'
)
- We get a result for each value; i.e.
Powershell 7 has it. 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
참고URL : https://stackoverflow.com/questions/31341998/ternary-operator-in-powershell
'Programing' 카테고리의 다른 글
생성자 vs 팩토리 메소드 (0) | 2020.05.26 |
---|---|
ggplot에서 모든 x 축 레이블 제거 (0) | 2020.05.26 |
Java 클래스가로드 된 위치 찾기 (0) | 2020.05.26 |
이 반복적 인리스트 증가 코드가 왜 IndexError :리스트 할당 인덱스가 범위를 벗어 납니까? (0) | 2020.05.26 |
요청과 응답을 어떻게 조롱 할 수 있습니까? (0) | 2020.05.26 |