数组在 PowerShell 中的函数外没有输出

Array gives no output outside Function in PowerShell

这是代码

$conn =  'saruspc01', '194.195.5.65'

 function lll {
    foreach($co in $conn)
    {
       $check = Test-Connection $co -Count 3 -ErrorAction SilentlyContinue
       $zugriffzeit = $check | select ResponseTime | Measure-Object ResponseTime -Average
       $avg = [system.math]::Round($zugriffzeit.Average)

        if($check -eq $null)
        {
            $pcre = Write-Output $co
            $pire = Write-Output 'False'
            $zure = 'Null'
        }
        else
        {
            $pcre = Write-Output $co
            $pire = Write-Output 'True'
            $zure = Write-Output "$avg ms"
            $zure = $zure.Replace(' ','')
        }
        $table += @( @{PCName=$pcre;    PingResult=$pire;    Zugriffszeit=$zure} )
        #$table | ForEach {[PSCustomObject]$_} | Format-Table -AutoSize
    }
}

如果我在没有函数的情况下执行相同的代码,它就可以工作。不过我需要 Funktion 并且想这样做。我该如何解决?

最大的问题是您正在向 $table 添加项目,但您没有 return 将 table 输出返回给用户。因此,首先,将函数的末尾修改为如下所示。 (我添加了评论 #EndOfForEach 以帮助突出显示需要更改的地方。

        $table += @( @{PCName=$pcre;    PingResult=$pire;    Zugriffszeit=$zure} )                
    }#EndOfForEach
    return $table
}

完成更改后,您的函数将起作用,但仅当您这样调用它时才会起作用:

PS:\>lll
Name                           Value                                             
----                           -----                                             
PCName                         behemoth                                          
Zugriffszeit                   1ms                                               
PingResult                     True                                              
PCName                         notonline                                         
Zugriffszeit                   Null                                              
PingResult                     False                                             

此时,我建议进行两项更改。第一,布局难以阅读,所以我将函数转换为使用 [psCustomObject] 数据类型,就像这样。

function lll {
    $results = New-Object System.Collections.ArrayList
    #...

   $results.Add([psCustomObject]@{PCName=$pcre;    PingResult=$pire;    Zugriffszeit=$zure})| Out-Null
    }#EndOfForEach
    return $results
}

对于这样的输出:

PS>lll

PCName    PingResult Zugriffszeit
------    ---------- ------------
behemoth  True       1ms         
notonline False      Null  

如果您想将函数提升到一个新的水平,最好修改函数以接受参数,而不是依赖已设置的 $conn 变量。希望这对您有所帮助,如果您有任何问题或我是否可以深入研究某个领域,请告诉我。

为什么 $results 不维护一个值?

PowerShell 使用变量作用域,因此我们在此函数中定义的 $results 变量将只存在 for 只要函数是 运行。要保留结果,请在调用函数时将它们分配给变量,如下所示。

$MyPingResults = lll
#no output is written to screen.

PS>$MyPingResults #get all results
PCName    PingResult Zugriffszeit
------    ---------- ------------
behemoth  True       1ms         
notonline False      Null     

PS>$myPingResults[0] #get first result

PCName   PingResult Zugriffszeit
------   ---------- ------------
behemoth True       7ms         

PS>$myPingResults | Where PingResult -eq $false #only get failed results

PCName    PingResult Zugriffszeit
------    ---------- ------------
notonline False      Null        

完成脚本

function lll {
    $results = New-Object System.Collections.ArrayList
    foreach($co in $conn)
    {
       $check = Test-Connection $co -Count 3 -ErrorAction SilentlyContinue
       $zugriffzeit = $check | select ResponseTime | Measure-Object ResponseTime -Average
       $avg = [system.math]::Round($zugriffzeit.Average)

        if($check -eq $null)
        {
            $pcre = Write-Output $co
            $pire = Write-Output 'False'
            $zure = 'Null'
        }
        else
        {
            $pcre = Write-Output $co
            $pire = Write-Output 'True'
            $zure = Write-Output "$avg ms"
            $zure = $zure.Replace(' ','')
        }
        $results.Add([psCustomObject]@{PCName=$pcre;    PingResult=$pire;    Zugriffszeit=$zure})| Out-Null
    }#EndOfForEach
    return $results
}