我有一个脚本,它以XML格式从Web服务检索数据。某些元素可以存在 - 或者不存在 - 并且可以包含一个或多个子元素。因此我用这个检索价值:
$uid = $changeRecord.newAttrs | Where{$_.name -eq 'uid'} | Select -ExpandProperty Values | select -Index 0
这很好用。大多数答案的<values>
部分只有一个子元素,即使不是,我只对第一个感兴趣。但是,如果| select -Index 0
中只有一个元素,则最后一部分<values>
会在Windows事件日志中生成静默警告(另请参阅here)。因此,我想摆脱这个错误。
所以我正在寻找一种方法来实现相同的行为,而不会出现抛出错误 - 并且可能不仅仅是把try-catch放在一边。
谢谢!
//更新:如下所述,到目前为止提供的答案并未解决问题。现在最接近的是
([array]($changeRecord.newAttrs | Where{$_.name -eq 'uid'} | Select -ExpandProperty Values))[0]
但是,如果数组不包含任何元素,则会失败并显示错误。不知道是否可以在一行内处理这个问题吗?
答案 0 :(得分:1)
你试过这个:Select-Object -First 1
?
$uid = $changeRecord.newAttrs |
Where-Object {$_.name -eq 'uid'} |
Select-Object -ExpandProperty Values |
Select-Object -First 1
答案 1 :(得分:1)
Select -Index n
仅用于数组,因为它将从数组中的该索引中显式选择。因此,在单个对象上执行此操作时会遇到问题。 Select -First n
会从管道中获取n
个对象。
所有这一切,当我调用命令并且结果可能是单个项目或项目数组时,我通常将变量声明为数组或将值转换为数组,然后即使我得到一个单个对象从命令返回它将存储在一个数组中。这样无论返回什么,我都以同样的方式对待它。所以在你的情况下:
$uid = [array]($changeRecord.newAttrs | Where{$_.name -eq 'uid'} | Select -ExpandProperty Values) | select -Index 0
答案 2 :(得分:0)
所以,我终于找到了一个对我来说很好的解决方案:
$valueArray = [array]($changeRecord.newAttrs | Where{$_.name -eq 'uid'} | Select -ExpandProperty Values)
if(($valueArray -ne $null) -and ($valueArray.Count -gt 0))
{
$value = $valueArray.GetValue(0)
}
else
{
$value = "null..."
}
我首先将整个事物放入数组中,然后检查数组是否包含任何元素。只有这样,我才能得到第一个值。
感谢各位帮忙!