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