处理可以是数组或单个字符串的输出
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..."
}
我先把整个东西放到一个数组中,然后检查数组是否包含任何元素。只有这样,我才得到第一个值。
感谢大家的帮助!
我有脚本以 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..."
}
我先把整个东西放到一个数组中,然后检查数组是否包含任何元素。只有这样,我才得到第一个值。
感谢大家的帮助!