如何在PowerShell中使用内联If(IIf,另请参阅:http://en.wikipedia.org/wiki/IIf或ternary 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)
mjo*_*nor 29
'The condition is {0}.' -f ('false','true')[$condition]
Run Code Online (Sandbox Code Playgroud)
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)
这是另一种方式:
$condition = $false
"The condition is $(@{$true = "true"; $false = "false"}[$condition])"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
55372 次 |
| 最近记录: |