类似 :? 运算符的 PowerShell 语法?

标签 powershell ternary-operator null-coalescing-operator

<分区>

我正在做一件事情,我将一个 XML 文档分开并将一些元素的文本内容写入一个文件。加载 XML 文档后,基本方法非常简单:我所做的就是类似

$DI_XMLResponse.result.gudid.device.versionModelNumber | Out-File -FilePath $OutputFile -Append -NoClobber -编码ascii

但我需要安排在叶元素没有内容或根本不存在的情况下发出一个空行。

我可以将内容赋值给一个变量,测试变量是否为空,如果是,则将其设为空字符串,然后将其写入文件,

$foo = $DI_XMLResponse.result.gudid.device.versionModelNumber 如果 (!$foo) $foo = '' $富 | Out-File -FilePath $OutputFile -Append -NoClobber -编码ascii

但我希望找到更紧凑的表达方式。有吗?

最佳答案

更新:

  • PowerShell(核心)7.0 引入了 ternary operator
    ( $condition ? $valueIfTrue : $valueIfFalse ) 和 null-coalescing operators ( $possibleNullValue ?? $valueIfNull$possibleNullValue ??= $valueIfNull

  • PowerShell(核心)7.1 引入了 null-conditional operators (${possibleNullValue}?.Property${possibleNullValue}?[0])

    • 注意不幸的是需要 {...}围绕变量名,因为 - 违反直觉 - ?当前是合法的变量名字符 - 参见 GitHub issue #14025 .

此答案的其余部分展示了模拟 PowerShell 6.x 及更早版本的三元运算符和空值合并的方法:


不幸的是,PowerShell 没有 ternary [conditional] operator (例如,
$condition ? $valueIfTrue : $valueIfFalse ) 或 null-coalescing operator (例如,
$possibleNullValue ?? $valueIfNull )
从 PowerShell Core 6.1.0 开始。

但是,增强语言以支持这些is being proposed .
如果您希望看到这种情况发生,请在那里发出您的声音 - 即使是简单的“竖起大拇指”也会有所帮助。

在您的特定情况下,您正在寻找null-coalescing 运算符,并且存在 - 次优 - 解决方法:


定义自定义函数,如Ryan Schlueter's answer所示对于三元运算符。

对于 null-coalescing 运算符,它可能是这样的:

function ?? ($PossiblyNull, $ValueIfNull) { 
  if ($null -eq $PossiblyNull) { $ValueIfNull } else { $PossiblyNull }
}

应用于您的代码:

?? $DI_XMLResponse.result.gudid.device.versionModelNumber '' |
  Out-File -FilePath $OutputFile -Append -NoClobber -Encoding ascii 

自定义函数的缺点是:

  • 您需要在要使用它们的每一段代码中包含或导入它们

  • 如果您选择熟悉的名称,例如 ?:??操作数的放置可能会令人困惑,因为您必须(总是)在 PowerShell 中以不同的方式放置它们,前提是将其实现为函数(例如,
    a ?? b在 C# 中与 ?? $a $b在 PowerShell 中)。


使用具有隐式 bool 到整数转换的辅助数组:

$foo = $DI_XMLResponse.result.gudid.device.versionModelNumber
($foo, '')[$null -eq $foo] | Out-File -FilePath $OutputFile -Append -NoClobber -Encoding ascii
  • ($foo, '')是包含要输出的两个可能值的数组。
  • $null -eq $foo是有条件的,计算结果为 $False , 如果 $foo$null , 和 $False否则
    • 请注意 $null故意放在左轴上,因为在右轴上它会执行不同的测试如果 $foo恰好是数组值。
  • 数组索引的上下文中,[int]值是预期的,所以 $True自动转换为 1 ,而 $False结果 0 .
  • 最终结果是如果 $foo$null , ''是输出;否则,$foo按原样使用。

这种方法的缺点:

  • 没有应用短路逻辑;即,在选择适当的元素之前,无条件地评估两个数组元素。

  • 如果只需要 null-coalescing,您必须存储值以测试 $null首先在变量中;例如,模拟
    (Get-Foo Bar) ?? '(none)'
    您必须先保存 Get-Foo Bar 的输出在一个辅助变量中,这样你就可以写:
    $aux = Get-Foo Bar; ($aux, '(none)')[$null -eq $aux]

关于类似 :? 运算符的 PowerShell 语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52899849/

相关文章:

powershell - 在 Powershell 中将对象添加到容器

javascript - 三元运算符始终评估真实部分

c - 我 % 2 == 0 ? arr [我] = 0 : arr[i] = 1; Ternary operator error

javascript 三元运算符 "chaining"

php - 最后一个操作数为空的空合并运算符

powershell - 追查为什么 PSSession 处于损坏状态?

windows - 将 PowerShell 转换为 Bash

powershell - 在Powershell中更改用户属性

Powershell 'x or y' 分配

scala - 是否可以在不使用反射的Scala中实现 `??`(C#中的空合并运算符)?