gpt4 book ai didi

PowerShell 内联 If (IIf)

转载 作者:行者123 更新时间:2023-12-03 06:06:40 110 4
gpt4 key购买 nike

如何在 PowerShell 中创建带有内联 If 的语句(IIf,另请参阅: Immediate ifternary If )?

如果您也认为这应该是 native PowerShell 函数,请投票: https://connect.microsoft.com/PowerShell/feedback/details/1497806/iif-statement-if-shorthand

更新(2019 年 10 月 7 日)

Microsoft Connect已经退休了,但好消息是 support for a ternary operator in PowerShell (Core) language似乎正在路上...

最佳答案

您可以使用 PowerShell 的 native 方式:

"The condition is " + (&{If($Condition) {"True"} Else {"False"}}) + "."

但是,由于这会在语法中添加大量圆括号和方括号,因此您可能会考虑以下(可能是现有的最小的之一)CmdLet:

Function IIf($If, $Right, $Wrong) {If ($If) {$Right} Else {$Wrong}}

这将简化您的命令:

"The condition is " + (IIf $Condition "True" "False") + "."
<小时/>

添加于 2014-09-19:

我一直在使用 IIf cmdlet 现在已经有一段时间了,我仍然认为它在很多情况下会使语法更具可读性,但正如我同意 Jason 的注释,关于不需要的副作用,即使显然只使用一个值,也会评估两个可能的值,我已更改IIf cmdlet 一点:

Function IIf($If, $IfTrue, $IfFalse) {
If ($If) {If ($IfTrue -is "ScriptBlock") {&$IfTrue} Else {$IfTrue}}
Else {If ($IfFalse -is "ScriptBlock") {&$IfFalse} Else {$IfFalse}}
}

现在您可能添加一个 ScriptBlock(由 {} 包围)而不是一个对象,如果不需要,则不会对其进行求值,如下例所示:

IIf $a {1/$a} NaN

或内联放置:

"The multiplicative inverse of $a is $(IIf $a {1/$a} NaN)."

万一$a具有非零值,则返回乘法逆元;否则,它将返回 NaN (其中 {1/$a} 未评估)。

另一个很好的例子,它将使安静的模糊语法变得更加简单(特别是当你想将其内联放置时)是你想要在一个可能是 $Null 的对象上运行一个方法。 .

原生‘If ’的方法是这样的:

If ($Object) {$a = $Object.Method()} Else {$a = $null}

(请注意,在例如需要重置 Else 的循环中,通常需要 $a 部分。)

IIf cmdlet 看起来像这样:

$a = IIf $Object {$Object.Method()}

(请注意,如果 $Object$Null ,并且未提供 $a 值,则 $Null 将自动设置为 $IfFalse。)

<小时/>

添加于 2014-09-19:

IIf 进行细微更改现在设置当前对象的 cmdlet( $_ $PSItem ):

Function IIf($If, $Then, $Else) {
If ($If -IsNot "Boolean") {$_ = $If}
If ($If) {If ($Then -is "ScriptBlock") {&$Then} Else {$Then}}
Else {If ($Else -is "ScriptBlock") {&$Else} Else {$Else}}
}

这意味着您可以使用对象上的方法来简化语句(PowerShell 方式),该对象可能是 $Null .

现在的一般语法为 $a = IIf $Object {$_.Method()} 。一个更常见的示例如下所示:

$VolatileEnvironment = Get-Item -ErrorAction SilentlyContinue "HKCU:\Volatile Environment"
$UserName = IIf $VolatileEnvironment {$_.GetValue("UserName")}

请注意命令 $VolatileEnvironment.GetValue("UserName")如果相关注册表 ( HKCU:\Volatile Environment ) 不存在,通常会导致“您无法在空值表达式上调用方法。” 错误;其中命令 IIf $VolatileEnvironment {$_.GetValue("UserName")}只会返回$Null .

如果$If参数是一个条件(类似于 $Number -lt 5 )或强制条件(使用 [Bool] 类型), IIf cmdlet 不会否决当前对象,例如:

$RegistryKeys | ForEach {
$UserName = IIf ($Number -lt 5) {$_.GetValue("UserName")}
}

或者:

$RegistryKeys | ForEach {
$UserName = IIf [Bool]$VolatileEnvironment {$_.OtherMethod()}
}
<小时/>

于 2020 年 3 月 20 日添加:

Using the ternary operator syntax

PowerShell 7.0 引入了使用三元运算符的新语法。它遵循 C# 三元运算符语法:

The ternary operator behaves like the simplified if-else statement. The <condition> expression is evaluated and the result is converted to a boolean to determine which branch should be evaluated next:

The <if-true> expression is executed if the <condition> expression is true The <if-false> expression is executed if the <condition> expression is false

示例:

"The multiplicative inverse of $a is $($a ? (& {1/$a}) : 'NaN')."

关于PowerShell 内联 If (IIf),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25682507/

110 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com