处理可以是数组或单个字符串的输出

时间:2015-03-16 18:16:50

标签: powershell powershell-v4.0

我有一个脚本,它以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]

但是,如果数组不包含任何元素,则会失败并显示错误。不知道是否可以在一行内处理这个问题吗?

3 个答案:

答案 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..."
}

我首先将整个事物放入数组中,然后检查数组是否包含任何元素。只有这样,我才能得到第一个值。

感谢各位帮忙!