Создать пустой объект для Test-Connection

Я недавно ответил на SO сообщение о Test-Connection Скрипт Powershell: создание цикла для ResponseTime

Когда Test-Connection не может подключиться, он вернет System.Net.NetworkInformation.PingException это нормально, но я бы хотел записать это как пустой объект в выводе, а не пропускать его. Я знаю, что я мог бы просто select свойства, которые я хочу, и просто создать пользовательский объект для вывода в командной строке. Вот как я подошел к связанному вопросу, но чувствую, что мог бы добиться большего.

Мое желание - иметь такой результат

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   

Два возвращения являются правильными из Test-Connection со вставленной фиктивной линией. Он имеет все свойства правильного возврата из Test-Connection но, поскольку это не удалось, только некоторые свойства имеют значения. Единственный подход, который я попытался сделать, это создать еще один объект аналогичного типа. Заметка (Test-Connection -Count 1 localhost).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 = $_
    }
} 

Test-Connection возвращает больше, чем просто System.Management.ManagementObject, Таким образом, проблема в том, что новый объект не будет иметь такие же свойства и, как следствие, $blank.Destination = $_ потерпит неудачу, так как "Назначение" не может быть найдено на этом объекте ". Я также экспериментировал с Test-Connection -Count 1 127.0.0.1 | gm -MemberType Property попытаться создать коллекцию свойств, которую я мог бы использовать для создания моего пустого объекта, но это не приносило плодов. Скорее всего, так как я не делаю это правильно.

FYI

Я надеюсь применить эту логику в других местах моих сценариев. В то время как test-connection это командлет, на котором я остановлюсь в этом вопросе, я ищу более широкое решение.

попытка

Я попытался, но безуспешно, что-то вроде этого, но объект не выводятся вместе.

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

2 ответа

Не уверен, поможет ли это или нет:

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

Команда select * сохранит все свойства, но преобразует их в свойства заметок, чтобы они были доступны для записи, и вы можете установить их так, как вы хотите.

Я бы, наверное, сделал что-то вроде этого:

$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
}

[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
      }
    }
  }
}

Вывод будет выглядеть примерно так:

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
Другие вопросы по тегам