PowerShell语法类似于:?operator?[duplicate]

j5fpnvbx  于 2023-11-18  发布在  Shell
关注(0)|答案(3)|浏览(157)

此问题在此处已有答案

Ternary operator in PowerShell(14个答案)
5年前关闭。
我正在做的一件事是,我拆开一个XML文档,并将一些元素的文本内容写入一个文件。
第一个月
但是我需要安排一个空行,在leaf元素没有内容或者根本不存在的情况下发出。
我可以将内容赋给一个变量,测试变量是否为null,如果是,则将其设置为空字符串,然后将其写入文件,
$foo = $DI_XMLResponse.result.gudid.device.versionModelNumber if (!$foo) $foo = '' $foo | Out-File -FilePath $OutputFile -Append -NoClobber -Encoding ascii
但我希望能找到更简洁的表达方式,有吗

wkyowqbh

wkyowqbh1#

更新

  • PowerShell(Core)7.0引入了三元运算符

$condition ? $valueIfTrue : $valueIfFalse)和空合并运算符($possibleNullValue ?? $valueIfNull$possibleNullValue ??= $valueIfNull}

  • PowerShell(Core)7.1引入了空条件运算符(${possibleNullValue}?.Property${possibleNullValue}?[0]
  • 请注意,不幸的是,变量名周围需要{...},因为-违反直觉-?目前是一个法律的变量名字符-参见GitHub issue #14025

这个答案的其余部分展示了**模拟 Windows PowerShell(以及现在已经过时的PowerShell(Core)版本 *6.x和更早版本 *)的三元运算符和空合并的方法:
不幸的是,Windows PowerShell 没有 * ternary [conditional] operator(例如,
$condition ? $valueIfTrue : $valueIfFalse)或null-coalescing operator(例如,
$possibleNullValue ?? $valueIfNull

在您的特定情况下,您正在寻找 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中以不同的方式放置它们,因为实现为 * 函数 *(例如,

C#中的a ?? b与PowerShell中的?? $a $b)。
使用helper数组进行隐式布尔到整数转换

$foo = $DI_XMLResponse.result.gudid.device.versionModelNumber
($foo, '')[$null -eq $foo] | Out-File -FilePath $OutputFile -Append -NoClobber -Encoding ascii

  • ($foo, '')是一个包含两个可能输出值的数组。
  • $null -eq $foo是有条件的,如果$foo$null,则计算为$False,否则为$False
  • 请注意,$null是故意放在LHS上的,因为在RHS上,如果$foo碰巧是 array 值,它将执行不同的测试。
  • 在 * 数组索引 * 的上下文中,需要[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]

wyyhbhjk

wyyhbhjk2#

这是我去是添加一个小插件。PowerShell Inline If (IIf)

$foo = $null;
Write-Host (IIf $foo "True" "False")

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

字符串

dwbf0jvd

dwbf0jvd3#

JavaScript可以作为表达式来计算。这对你来说意味着,如果你只关心简洁性而不是可读性,你可以转换你所做的事情:

if (-not ($foo = $xml. ...)) {
    $foo = ''
}

字符串

相关问题