当前位置: 首页 > 知识库问答 >
问题:

PowerShell内联If(IIf)

杨甫
2023-03-14

Microsoft Connect已经退役,但好消息是,对PowerShell(Core)语言中三元运算符的支持似乎正在进行中。

共有1个答案

卫学真
2023-03-14

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

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

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

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

这将使您的命令简化为:

"The condition is " + (IIf $Condition "True" "False") + "."
Function IIf($If, $IfTrue, $IfFalse) {
    If ($If) {If ($IfTrue -is "ScriptBlock") {&$IfTrue} Else {$IfTrue}}
    Else {If ($IfFalse -is "ScriptBlock") {&$IfFalse} Else {$IfFalse}}
}
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}
$a = IIf $Object {$Object.Method()}

(请注意,如果$object$null,则如果未提供$ifalse值,则$a将自动设置为$null。)

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}}
}

这方面的一般语法现在将是$A=IIf$Object{$_.method()}。更常见的示例如下所示:

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

请注意,命令$VolateEnvironment.getValue(“username”)通常会导致“您不能对空值表达式调用方法”。如果相关注册表(hkcu:\volatile environment)不存在,则出错;其中命令iif$VolateEnvironment{$_.getValue(“username”)}将只返回$null

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

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

或:

$RegistryKeys | ForEach {
    $UserName = IIf [Bool]$VolatileEnvironment {$_.OtherMethod()}
}

新增2020-03-20:

使用三元运算符语法

PowerShell7.0引入了使用三元html" target="_blank">运算符的新语法。它遵循C#三元运算符语法:

三元运算符的行为类似于简化的if-else语句。计算 表达式,并将结果转换为布尔值,以确定下一步应计算哪个分支:

"The multiplicative inverse of $a is $($a ? (& {1/$a}) : 'NaN')."
 类似资料:
  • 问题内容: 如何在JavaScript中使用内联语句?是否也有内联语句? 像这样: 问题答案: 您不一定需要jQuery。仅JavaScript就能做到这一点。 该变量将是如果该值,并且如果该值是。 这称为条件(三元)运算符。

  • 如果Django模型的字段与条件匹配,则将其指定给值。 在这种情况下我怎么什么都不做?如果条件通过,我们就不能做

  • 我想使用PowerShell生成命令列表,将文件从一个位置移动到另一个位置。(我确信PowerSell确实可以移动,但我想先看看命令列表……是的,我知道)。 文件位于下一层的一系列子文件夹中,需要移动到另一台主机上相应的一系列子文件夹中。子文件夹具有8位标识符。我需要一系列命令,比如 该文件需要进入相应的8位标识符文件夹的\导入子目录。 下面的PowerShell将生成我需要的数据 但我一直在研究

  • 问题内容: VS 哪种被认为是 正确的 (语法上)且性能最高的方法,为什么? 后一个示例中的语法对我来说似乎更合乎逻辑,但我的假设是JOIN会更快。 我看过查询计划,还无法从中解密任何内容。 查询计划1 查询计划2 问题答案: 两种语法有不同的用途。假设使用Join语法,则需要StockToCategory和Category表中的某些内容。如果每个类别的StockToCategory表中有多个条目