Object 为测试连接创建空白对象

Object 为测试连接创建空白对象,object,powershell,Object,Powershell,我最近回复了一篇关于测试连接的SO帖子 当测试连接无法连接时,它将返回一个System.Net.NetworkInformation.PingException,这很好,但我想在输出中记录为空对象,而不是跳过它。我知道我可以选择我想要的属性,然后在命令行上创建一个自定义对象来输出。这就是我处理相关问题的方式,但我觉得我可以做得更好 我的愿望是有这样的产出 Source Destination IPV4Address IPV6Address

我最近回复了一篇关于测试连接的SO帖子

测试连接
无法连接时,它将返回一个
System.Net.NetworkInformation.PingException
,这很好,但我想在输出中记录为空对象,而不是跳过它。我知道我可以选择我想要的属性,然后在命令行上创建一个自定义对象来输出。这就是我处理相关问题的方式,但我觉得我可以做得更好

我的愿望是有这样的产出

Source        Destination     IPV4Address      IPV6Address                              Bytes    Time(ms) 
------        -----------     -----------      -----------                              -----    -------- 
WYVERN        localhost       127.0.0.1        ::1                                      32       0        
              failed host     169.254.158.1
WYVERN        localhost       127.0.0.1        ::1                                      32       0   
在插入虚拟线的情况下,从
测试连接
返回的两个值是正确的。它具有测试连接正确返回的所有属性,但由于失败,只有部分属性具有值。我试图实现这一点的唯一方法是创建另一个类似类型的对象。注意
(测试连接-计数1本地主机)。GetType().FullName
返回
System.Management.ManagementObject

$servers = "10.50.10.100","169.254.54.1"
$servers | ForEach-Object{
    Test-Connection $_ -Count 1 -ErrorAction SilentlyContinue
    If(!$testconnection){
        $blank = New-Object -TypeName System.Management.ManagementObject
        $blank.Destination = $_
    }
} 
测试连接
返回的不仅仅是基本的
System.Management.ManagementObject
。因此,问题在于新对象将不具有相同的属性,因此,
$blank.Destination=$\uz
将失败,因为“'Destination'无法在此对象上找到”。我还尝试了
testconnection-count1127.0.0.1 | gm-MemberType属性
,尝试创建一个属性集合,我可以用它来构建我的空白对象,但没有结果。很可能是因为我做得不对

FYI

我希望在我的脚本的其他地方应用这个逻辑。虽然
测试连接
是我在这个问题中所讨论的cmdlet,但我正在寻找更广泛的解决方案

尝试

我尝试过类似的方法,但没有成功,但是对象没有一起输出

$props = @{}
Test-Connection -Count 1 127.0.0.1 | gm -MemberType Property | %{$props.($_.Name) = ""}
$props.destination = "FailedHostAddress"
New-Object -TypeName PSCustomObject -Property $props

不确定这是否有帮助:

$base = Test-Connection 127.0.0.1 -Count 1 
$blank = $base | select *
foreach ($prop in $base.psobject.Properties.Name)
{$blank.$prop = $null}

select*将保留所有属性,但将它们转换为Notes属性,以便它们可写,并且您可以将它们设置为您想要的任何属性。

我可能会这样做:

$servers = '10.50.10.100', '169.254.54.1', 'somehost'

$servers | % {
  $dst = $_
  try {
    Test-Connection $dst -Count 1 -ErrorAction Stop | % {
      $props = [ordered]@{
        'Source'      = $env:COMPUTERNAME
        'Destination' = $dst
        'IPv4Address' = $_.IPV4Address
        'IPv6Address' = $_.IPV6Address
        'Available'   = $true
      }
    }
  } catch {
    try {
      $addr = [ipaddress]$dst
      $props = [ordered]@{
        'Source'      = $env:COMPUTERNAME
        'Destination' = $dst
        'IPv4Address' = $addr.MapToIPv4()
        'IPv6Address' = $addr.MapToIPv6()
        'Available'   = $false
      }
    } catch {
      $props = [ordered]@{
        'Source'      = $env:COMPUTERNAME
        'Destination' = $dst
        'IPv4Address' = $null
        'IPv6Address' = $null
        'Available'   = $false
      }
    }
  }
  New-Object -Type PSObject -Property $props
}
Source  Destination   IPv4Address   IPv6Address                   Available
------  -----------   -----------   -----------                   ---------
WYVERN  10.50.10.100  10.50.10.100  fe80::3a8f:4854:248d:787f%11       True
WYVERN  169.254.54.1  169.254.54.1  ::ffff:169.254.54.1               False
WYVERN  somehost                                                      False
[ordered]
散列构成属性

使用PowerShell v3或更新版本,可以简化为:

$servers | % {
  $dst = $_
  try {
    Test-Connection $dst -Count 1 -ErrorAction Stop | % {
      [PSCustomObject]@{
        'Source'      = $env:COMPUTERNAME
        'Destination' = $dst
        'IPv4Address' = $_.IPV4Address
        'IPv6Address' = $_.IPV6Address
        'Available'   = $true
      }
    }
  } catch {
    try {
      $addr = [ipaddress]$dst
      [PSCustomObject]@{
        'Source'      = $env:COMPUTERNAME
        'Destination' = $dst
        'IPv4Address' = $addr.MapToIPv4()
        'IPv6Address' = $addr.MapToIPv6()
        'Available'   = $false
      }
    } catch {
      [PSCustomObject]@{
        'Source'      = $env:COMPUTERNAME
        'Destination' = $dst
        'IPv4Address' = $null
        'IPv6Address' = $null
        'Available'   = $false
      }
    }
  }
}
输出将有点像这样:

$servers = '10.50.10.100', '169.254.54.1', 'somehost'

$servers | % {
  $dst = $_
  try {
    Test-Connection $dst -Count 1 -ErrorAction Stop | % {
      $props = [ordered]@{
        'Source'      = $env:COMPUTERNAME
        'Destination' = $dst
        'IPv4Address' = $_.IPV4Address
        'IPv6Address' = $_.IPV6Address
        'Available'   = $true
      }
    }
  } catch {
    try {
      $addr = [ipaddress]$dst
      $props = [ordered]@{
        'Source'      = $env:COMPUTERNAME
        'Destination' = $dst
        'IPv4Address' = $addr.MapToIPv4()
        'IPv6Address' = $addr.MapToIPv6()
        'Available'   = $false
      }
    } catch {
      $props = [ordered]@{
        'Source'      = $env:COMPUTERNAME
        'Destination' = $dst
        'IPv4Address' = $null
        'IPv6Address' = $null
        'Available'   = $false
      }
    }
  }
  New-Object -Type PSObject -Property $props
}
Source  Destination   IPv4Address   IPv6Address                   Available
------  -----------   -----------   -----------                   ---------
WYVERN  10.50.10.100  10.50.10.100  fe80::3a8f:4854:248d:787f%11       True
WYVERN  169.254.54.1  169.254.54.1  ::ffff:169.254.54.1               False
WYVERN  somehost                                                      False

你有没有试过我在回答你提到的问题时建议的方法?在循环中创建属性和对象并将其添加到数组?此外,您还可以使用
add Member
@TheMadTechnician向PSObject添加属性。是的,您在参考中所做的工作将起作用,但您不认为它解决了我的问题。你们正在制作自定义对象,我试图解释这不是我想要做的。在不实际运行测试连接的情况下,如何将结果手动添加到
测试连接
集合?假设是平的possible@paul我想我对你的反应和对《疯狂》的反应是一样的<代码>添加成员,虽然它可以工作,但对于我的问题来说,这是一个低效且不动态的解决方案。我想我需要对我的问题进行编辑。。。只是不确定是什么。所以您的特定示例的问题是测试连接实际上运行WMI查询并回退WMI对象。这是不容易做到的。PowerShell中的任何标准类型都非常容易生成。为此,您可以ping“localhost”并将结果保存到变量中,然后手动编辑属性。它实际返回的对象是一个WMI对象“Win32\u PingStatus”,您可以使用
get WMIObject Win32\u PingStatus-Filter'address=“localhost”
或类似的CIM命令来获取该对象。@TheMadTechnician
测试连接
可能是一个非常糟糕的示例,用于我所要求的内容。。。。或许我会删除这项质询。考虑到返回的是一个信息对象,我想我可以创建另一个对象,然后清空我想要的值……也许我会先尝试一下。谢谢你的努力。如果你看到我的问题,我在这个案例中所做的是ping本地主机以获取该信息。虽然我可以制作另一个
系统.Management.ManagementObject
这是我所希望的,但似乎我无法将
$blank
的输出与常规
测试连接
输出结合起来。事后来看,根据评论,使用
测试连接
可能是一个糟糕的例子。您在此处所做的操作确实创建了另一个具有空属性的对象,但如果不先强制转换它,我无法将此输出与
测试连接的输出合并。如果输出与WMI无关,我想这个答案应该合适。我先考。