PowerShell内联If(IIf)

iRo*_*Ron 49 powershell iif

如何在PowerShell中使用内联If(IIf,另请参阅:http://en.wikipedia.org/wiki/IIfternary If)创建一个语句?

如果您还认为这应该是本机PowerShell功能,请将其投票:https://connect.microsoft.com/PowerShell/feedback/details/1497806/iif-statement-if-shorthand

iRo*_*Ron 80

您可以使用PowerShell的本机方式:

"The condition is " + (&{If($Condition) {"True"} Else {"False"}}) + "."
Run Code Online (Sandbox Code Playgroud)

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

Function IIf($If, $Right, $Wrong) {If ($If) {$Right} Else {$Wrong}}
Run Code Online (Sandbox Code Playgroud)

这将简化您的命令:

"The condition is " + (IIf $Condition "True" "False") + "."
Run Code Online (Sandbox Code Playgroud)

新增2014-09-19:

我现在已经使用IIfcmdlet一段时间了,我仍然认为它会使语法在很多情况下更具可读性但是我同意Jason关于不需要的副作用的说明,即两个可能的值将被评估,即使显然只有一个值是使用过,我已经改变了一下IIfcmdlet:

Function IIf($If, $IfTrue, $IfFalse) {
    If ($If) {If ($IfTrue -is "ScriptBlock") {&$IfTrue} Else {$IfTrue}}
    Else {If ($IfFalse -is "ScriptBlock") {&$IfFalse} Else {$IfFalse}}
}
Run Code Online (Sandbox Code Playgroud)

现在您可以添加一个ScriptBlock(由{}'s 包围)而不是一个对象,如果不需要它将不会被评估,如下例所示:

IIf $a {1/$a} NaN
Run Code Online (Sandbox Code Playgroud)

或者内联:

"The multiplicative inverse of $a is $(IIf $a {1/$a} NaN)."
Run Code Online (Sandbox Code Playgroud)

如果$a具有非零值,则返回乘法逆; 否则,它将返回NaN({1/$a}未评估的地方).

另一个很好的例子,它会使一个安静的模糊语法更简单(特别是在你想要将它放在内联的情况下)是你想要在一个可能的对象上运行方法的地方$Null.本地的If"做法"是这样的:

If ($Object) {$a = $Object.Method()} Else {$a = $null}
Run Code Online (Sandbox Code Playgroud)

(请注意,在Else需要重置的循环中通常需要该部件$a.)

使用IIfcmdlet,它将如下所示:

$a = IIf $Object {$Object.Method()}
Run Code Online (Sandbox Code Playgroud)

(注意,如果$Object$Null,$a$Null在没有$IfFalse提供值的情况下自动设置为.)


新增2014-09-19:

IIfcmdlet进行微小更改,该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}}
}
Run Code Online (Sandbox Code Playgroud)

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

现在的一般语法是$a = IIf $Object {$_.Method()}.一个更常见的例子看起来像:

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

请注意,该命令$VolatileEnvironment.GetValue("UserName")通常会导致"您无法在空值表达式上调用方法".如果相关的注册表(HKCU:\Volatile Environment)不存在,则会出错; 命令 IIf $VolatileEnvironment {$_.GetValue("UserName")}将返回的位置$Null.

如果$If参数是条件(类似$Number -lt 5)或强制条件(具有[Bool]类型),则IIfcmdlet不会否决当前对象,例如:

$RegistryKeys | ForEach {
    $UserName = IIf ($Number -lt 5) {$_.GetValue("UserName")}
}
Run Code Online (Sandbox Code Playgroud)

要么:

$RegistryKeys | ForEach {
    $UserName = IIf [Bool]$VolatileEnvironment {$_.OtherMethod()}
}
Run Code Online (Sandbox Code Playgroud)

  • 你的第一个例子可以稍微简单一些:"条件是$(If($ Condition){"True"} Else {"False"})." (3认同)
  • 第二个例子很好,如果值没有副作用但是如果有副作用则不好,因为在进入IIf函数之前,副作用会发生在$ Right和$ Wrong上. (2认同)

mjo*_*nor 29

'The condition is {0}.' -f ('false','true')[$condition]
Run Code Online (Sandbox Code Playgroud)

  • 米乔利诺。在那里巧妙地使用索引运算符(结合复合格式)。 (2认同)

Iva*_*rov 23

实际上,Powershell会返回尚未分配的值

$a = if ($condition) { $true } else { $false }
Run Code Online (Sandbox Code Playgroud)

例:

"The item is $(if ($price -gt 100) { 'expensive' } else { 'cheap' })"
Run Code Online (Sandbox Code Playgroud)

我们来试试吧:

$price = 150
The item is expensive
$price = 75
The item is cheap
Run Code Online (Sandbox Code Playgroud)


ojk*_*ojk 5

这是另一种方式:

$condition = $false

"The condition is $(@{$true = "true"; $false = "false"}[$condition])"
Run Code Online (Sandbox Code Playgroud)