【问题标题】:Store output of ForEach into array in powershell将 ForEach 的输出存储到 powershell 中的数组中
【发布时间】:2017-06-25 01:59:31
【问题描述】:
$data = @("server1","server2","server3")

foreach ($server in $data) {
    $results = (Test-Connection $server -count 1 | Measure-Object -Property ResponseTime -Average).Average
}

我试图弄清楚如何获取 ForEach 的输出并将结果存储到一个数组中,以便稍后进行比较。我还没想出办法来做到这一点。

【问题讨论】:

  • $results = @( ForEach ( ... ) { ... } )
  • @PetSerAl,$results = @( foreach ...)$results = foreach ... 有什么区别,它不返回数组吗?另外,foreach 不应该返回一些东西,让它工作吗?
  • @4c74356b41 @() 总是返回数组。即使是零项或一项。
  • 那么零长度数组如何帮助比较结果?
  • @4c74356b41 它有助于消除特殊情况,当项目为零时,PowerShell 默认不返回数组。

标签: arrays powershell output


【解决方案1】:
    $FinalResult = @()
    $data = @("server1","server2","server3")
    foreach ($server in $data) {
        $results = (Test-Connection $server -count 1 | Measure-Object -Property ResponseTime -Average).Average

        $FinalResult += New-Object psobject -Property @{
                        ServerName = $server
                        Result = $result
                        }  
    }
   $FinalResult | Select ServerName, Result | Export-Csv ".\FinalResult.csv" -NoTypeInformation

如果这个 sn-p 不起作用,请告诉我,我会做必要的。

【讨论】:

    【解决方案2】:

    通过执行ForEach,您只是在测量标量(单个)对象的属性值。平均值永远只是该属性的值。

    Test-Connection 将接受名称数组作为 -ComputerName 参数,因此 ForEach 根本不是必需的。

     $data = @("server1","server2","server3")
    
     $results = Test-Connection $data -count 1 | select -ExpandProperty ResponseTime
    

    【讨论】:

    • 我用这个例子来了解我在做什么的概念。我没有使用Test-Connection,而是更大的脚本,但概念是一样的。只需要弄清楚如何将结果存储到一个数组中,同时让它循环直到没有更多的输入。
    • 那么您已经在 cmets 中找到了答案。只需将 foreach 输出重定向到一个变量,如果返回多个对象,Powershell 将自动构建一个数组。如果有必要防止下游错误,您可以使用 @() 语法将其强制为数组,以防它不返回多个对象。
    猜你喜欢
    • 2015-12-26
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-31
    • 1970-01-01
    • 2013-06-21
    相关资源
    最近更新 更多