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

Handle output that can either be an array or a single string

我有脚本以 XML 格式从 Web 服务检索数据。某些元素可以存在——也可以不存在——并且可以包含一个或多个子元素。因此我用这个检索值:

$uid = $changeRecord.newAttrs | Where{$_.name -eq 'uid'} | Select -ExpandProperty Values | select -Index 0

这很好用。大多数情况下,答案的 <values> 部分只有一个子元素,即使没有,我也只对第一个感兴趣。但是,如果 <values> 中只有一个元素,最后一部分 | select -Index 0 会在 Windows 事件日志中产生静默警告(另请参阅 here )。因此,我想摆脱错误。

所以我正在寻找一种方法来实现相同的行为而不会抛出错误 - 并且可能不仅仅是放置 try-catch。

谢谢!

// 更新:如下所述,目前给出的答案没有解决问题。现在最接近的是

([array]($changeRecord.newAttrs | Where{$_.name -eq 'uid'} | Select -ExpandProperty Values))[0]

但是,如果数组不包含任何元素,这将失败并出现错误。知道这是否也可以在一行内处理吗?

你试过这个吗:Select-Object -First 1 ?

$uid = $changeRecord.newAttrs |
    Where-Object {$_.name -eq 'uid'} |
        Select-Object -ExpandProperty Values |
            Select-Object -First 1

Select -Index n 仅用于数组,因为它将明确地从数组中的该索引 select 。因此,在单个对象上执行此操作时会遇到问题。 Select -First n 将使您从管道中获得 n 个对象。

综上所述,当我调用命令并且结果可能是单个项目或项目数组时,我通常将变量声明为数组或将值转换为数组,然后即使我从命令返回一个对象,它将存储在一个数组中。这样无论返回什么,我都以同样的方式对待它。所以在你的情况下:

$uid = [array]($changeRecord.newAttrs | Where{$_.name -eq 'uid'} | Select -ExpandProperty Values) | select -Index 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..."
}

我先把整个东西放到一个数组中,然后检查数组是否包含任何元素。只有这样,我才得到第一个值。

感谢大家的帮助!