我正在做一件事情,我拆开一个 XML 文档并将某些元素的文本内容写入文件。一旦加载了 XML 文档,基本方法就非常简单:我所做的就是类似
$DI_XMLResponse.result.gudid.device.versionModelNumber | Out-File -FilePath $OutputFile -Append -NoClobber -Encoding ascii
但我需要安排在叶元素没有内容或根本不存在的情况下发出空行。
我可以将内容分配给一个变量,测试该变量是否为空,如果是则将其设置为空字符串,然后将其写入文件,
$foo = $DI_XMLResponse.result.gudid.device.versionModelNumber
if (!$foo) $foo = ''
$foo | Out-File -FilePath $OutputFile -Append -NoClobber -Encoding ascii
但我希望找到一些更紧凑的表达方式。有吗
更新:
PowerShell(核心)7.0引入了三元运算符
(
$condition ? $valueIfTrue : $valueIfFalse
)和空合并运算符($possibleNullValue ?? $valueIfNull
和$possibleNullValue ??= $valueIfNull
}
PowerShell(核心)7.1引入了null条件运算符(
${possibleNullValue}?.Property
和${possibleNullValue}?[0]
)
{...}
,因为 - 与直觉相反 - ?
目前是合法的变量名称字符 - 请参阅 GitHub 问题 #14025。本答案的其余部分显示了模拟三元运算符和Windows PowerShell的空合并(以及现在已过时的PowerShell(核心)版本6.x及更早版本)的方法:
Windows PowerShell没有有三元[条件]运算符(例如,
$condition ? $valueIfTrue : $valueIfFalse
)或空合并运算符(例如,
$possibleNullValue ?? $valueIfNull
). 在您的具体情况下,
您正在寻找 null-coalescing 运算符,并且有 - 次优 - 解决方法:
定义一个自定义函数,如 Ryan Schlueter 对 ternary 运算符的回答所示。
对于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
?? $a $b
)。
:
$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
碰巧是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]
if (-not ($foo = $xml. ...)) {
$foo = ''
}