我正在做一件事情,我将一个 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 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
自定义函数的缺点是:
使用具有隐式 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]