Arrays 测试连接$False将不会转换为ArrayList

Arrays 测试连接$False将不会转换为ArrayList,arrays,powershell,Arrays,Powershell,目前正在制作将使用PowerShell生成的新报告。使用PowerShell构建HTML电子邮件。我还有一份工作正常的报告,但在这一份上遇到了意想不到的问题 下面的代码只是我正在构建的脚本中的示例。仍在为脚本添加片段,但在前进过程中对其进行测试。我添加了一个测试连接,以查看计算机是否响应,并失去了构建阵列的能力 我使用此报告的最终目标是从文件中导入名称列表,然后在所有计算机上循环,查看它们是否正在ping,并使用Get WMIObject等从中收集一些信息 下面的代码将复制我遇到的问题,但我不确

目前正在制作将使用PowerShell生成的新报告。使用PowerShell构建HTML电子邮件。我还有一份工作正常的报告,但在这一份上遇到了意想不到的问题

下面的代码只是我正在构建的脚本中的示例。仍在为脚本添加片段,但在前进过程中对其进行测试。我添加了一个
测试连接
,以查看计算机是否响应,并失去了构建阵列的能力

我使用此报告的最终目标是从文件中导入名称列表,然后在所有计算机上循环,查看它们是否正在ping,并使用
Get WMIObject
等从中收集一些信息

下面的代码将复制我遇到的问题,但我不确定如何解决它。我已经将问题缩小到
测试连接
返回'False'时。在第26行,我正在筛选在
测试连接上返回'False'的结果,以将它们保存到自己的数组中,以便我可以在代码的不同部分使用该数组来构建HTML表/HTML以发送电子邮件

只有反面,如果我告诉它只查找“True”,它将无问题地保存到数组中

这是PowerShell在按“False”进行筛选时给出的错误

无法将值“@{Computer\u Name=Computer1;Ping\u Status=False}”转换为类型“System.Collections.ArrayList”。错误:“无法将类型为“Selected.System.Management.Automation.PSCustomObject”的“@{Computer\u Name=Computer1 Ping\u Status=False}”值转换为类型“System.Collections.ArrayList”。”

请让我知道,如果有任何其他信息,我可以提供。这件事我已经讨论了一段时间了。同事们甚至说这是一个奇怪的问题

测试连接
返回一个'False'的方式有什么独特之处吗

CLS
[string]$ErrorActionPreference = "Continue"

[System.Collections.ArrayList]$Names = @(
    "Computer1"
    "Computer2"
)

[System.Collections.ArrayList]$WMI_Array = @()
[System.Collections.ArrayList]$Ping_Status_False = @()

foreach ($Name in $Names) {
    [bool]$Ping_Status = Test-Connection $Name -Count 1 -Quiet

    $WMI_Array_Object = [PSCustomObject]@{
            'Computer_Name' = $Name
            'Ping_Status'   = $Ping_Status
    }        
    $WMI_Array.Add($WMI_Array_Object) | Out-Null
}

$WMI_Array | Format-Table

[System.Collections.ArrayList]$Ping_Status_False = $WMI_Array | Where-Object {$_.Ping_Status -eq $false} | Select-Object Computer_Name, Ping_Status

$Ping_Status_False

问题不在于测试连接,而在于此语句

$WMI_Array | Where-Object {$_.Ping_Status -eq $false} | Select-Object Computer_Name, Ping_Status
只产生一个结果。它不是数组,因此不能转换为
ArrayList
。当您仅使用一个匹配对象筛选
$\u0.PingStatus-eq$true
时,行为是相同的,因此我怀疑您有多个成功ping的主机,或者在测试该条件时根本没有主机,并且没有抛出相同的错误

可以通过将语句包装在数组子表达式运算符中来缓解此问题:

[Collections.ArrayList]$Ping_Status_False = @($WMI_Array |
    Where-Object {$_.Ping_Status -eq $false} |
    Select-Object Computer_Name, Ping_Status)
或者,您可以简单地从代码中删除所有无意义的类型转换:

$ErrorActionPreference = "Continue"

$Names = 'Computer1', 'Computer2'

$WMI_Array = foreach ($Name in $Names) {
    [PSCustomObject]@{
        'Computer_Name' = $Name
        'Ping_Status'   = [bool](Test-Connection $Name -Count 1 -Quiet)
    }        
}

$WMI_Array | Where-Object { -not $_.Ping_Status }

我认为问题在于,当你过滤False时,它只返回1个对象。尝试包装并首先将其转换为数组
[System.Collections.ArrayList]$Ping\u Status\u False=[array]($WMI\u array |))
甚至
[object[]]
我不确定我是否理解您的意思。如果运行$WMI_Array |其中对象{$\ Ping_Status-eq$false}|选择对象计算机名称,Ping_Status,则会得到所需的结果。如果Ping_Status为$false,它将不会保存到其他数组中。您所说的问题正是问题所在。谢谢你在这方面的帮助。非常感谢。这让我找到了正确的方向。