数组在 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
}
这是代码
$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
}