Создать пустой объект для 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