如何创建一个带有内联If(IIf)的a语句,另请参阅:Immediate if或ternary If)中的任何一个?
如果你也认为这应该是一个原生的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似乎正在路上。
7条答案
按热度按时间mkh04yzy1#
您可以使用PowerShell的原生方式:
但由于这会在语法中添加大量括号和方括号,您可以考虑以下(可能是现有最小的CmdLet之一):
这将使您的命令简化为:
我使用
IIf
cmdlet已经有一段时间了,我仍然认为它会在很多情况下使语法更具可读性,但由于我同意Jason关于不必要的副作用的说明,即即使显然只使用一个值,也会评估两个可能的值,我对IIf
cmdlet进行了一些更改:现在你可以添加一个ScriptBlock(被
{}
包围),而不是一个对象,如果不需要它,它将不会被计算,如下面的例子所示:或置于内联:
在
$a
具有非零的值的情况下,返回乘法逆;否则,它将返回NaN
(其中不计算{1/$a}
)。另一个很好的例子,它将使一个安静的模糊语法变得简单得多(特别是在你想把它放在内联的情况下),你想在一个对象上运行一个方法,这个对象可能是
$Null
。原生的“
If
”方法是这样的:(Note
Else
部分通常需要在例如循环,需要重置$a
。)使用
IIf
cmdlet,它看起来像这样:(Note如果
$Object
为$Null
,则如果未提供$IfFalse
值,则$a
将自动设置为$Null
。)对
IIf
cmdlet进行了微小更改,该cmdlet现在设置当前对象($_
或$PSItem
):这意味着您可以使用对象上的方法简化语句(PowerShell方式),该对象可能是
$Null
。现在的通用语法是
$a = IIf $Object {$_.Method()}
。一个更常见的例子看起来像这样:请注意,如果相关注册表(
HKCU:\Volatile Environment
)不存在,则命令$VolatileEnvironment.GetValue("UserName")
通常会导致**“You cannot call a method on a null-valued expression."**错误;命令IIf $VolatileEnvironment {$_.GetValue("UserName")}
将返回$Null
。如果
$If
参数是一个条件(类似于$Number -lt 5
)或强制为一个条件(具有[Bool]
类型),则IIf
cmdlet不会否决当前对象,例如:或者:
使用三元运算符语法
PowerShell 7.0引入了使用三元运算符的新语法。它遵循C#三元运算符语法:
三元运算符的行为类似于简化的
if-else
语句。计算<condition>
表达式,并将结果转换为布尔值,以确定接下来应该计算哪个分支:如果
<condition>
表达式为true,则执行<if-true>
表达式如果<condition>
表达式为false,则执行<if-false>
表达式示例:
7y4bm7vi2#
**Powershell 7+**允许三元运算符:
Powershell 6(或更早版本)返回尚未分配的值。
lbsnaicq3#
tp5buhyn4#
这里是另一种方法:
dfuffjeb5#
来自博客文章 DIY: Ternary operator:
然后你可以像这样使用它:
这是迄今为止我看到的最接近的变体。
busg9geu6#
vmdwslir7#
PowerShell不支持内联ifs。你必须创建自己的函数(另一个答案建议),或者在一行中合并if/else语句(另一个答案也建议)。