此问题在此处已有答案:
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
个
但我希望能找到更简洁的表达方式,有吗
3条答案
按热度按时间wkyowqbh1#
更新:
(
$condition ? $valueIfTrue : $valueIfFalse
)和空合并运算符($possibleNullValue ?? $valueIfNull
和$possibleNullValue ??= $valueIfNull
}${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 运算符,它可能是这样的:
字符串
应用于您的代码:
型
自定义函数的缺点是:
?:
和??
,操作数的放置可能会令人困惑,因为您必须(总是)在PowerShell中以不同的方式放置它们,因为实现为 * 函数 *(例如,C#中的
a ?? b
与PowerShell中的?? $a $b
)。使用helper数组进行隐式布尔到整数转换:
型
($foo, '')
是一个包含两个可能输出值的数组。$null -eq $foo
是有条件的,如果$foo
是$null
,则计算为$False
,否则为$False
$null
是故意放在LHS上的,因为在RHS上,如果$foo
碰巧是 array 值,它将执行不同的测试。[int]
值,因此$True
会自动转换为1
,而$False
会导致0
。$foo
是$null
,则输出''
;否则,$foo
按原样使用。这种方法的缺点:
*不应用短路逻辑;即,在选择适当的元素之前,对两个数组元素进行 * 无条件 * 评估。
$null
测试的值存储在变量中;例如,(Get-Foo Bar) ?? '(none)'
你必须先将
Get-Foo Bar
的输出保存到一个辅助变量中,这样你就可以写:$aux = Get-Foo Bar; ($aux, '(none)')[$null -eq $aux]
个wyyhbhjk2#
这是我去是添加一个小插件。PowerShell Inline If (IIf)
字符串
dwbf0jvd3#
JavaScript可以作为表达式来计算。这对你来说意味着,如果你只关心简洁性而不是可读性,你可以转换你所做的事情:
字符串