最大的问题是您正在向$table 添加项目,但您没有将return 表输出返回给用户。因此,首先,将函数的结尾修改为如下所示。 (我添加了评论 #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 变量将只存在只要函数正在运行。要保留结果,请在调用函数时将它们分配给变量,如下所示。
$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
}