使用IP地址运行Test-Connection
需要比使用服务器主机名运行相同命令的时间长得多。
然而;如果我添加-quiet
参数,那么性能大致相同(IP速度快一点,如您所料)。
使用Measure-Command
此异常未显示;可能是输出的一些怪癖没有显示出来。
以下代码更准确地反映了所看到的异常情况:
$begin=(get-date).ticks;test-connection '123.45.67.89'; $a=((get-date).ticks - $begin)
$begin=(get-date).ticks;test-connection 'MyHostName'; $b=((get-date).ticks - $begin)
$a-$b
同事们在他们的机器上重现了同样的问题。
问题:是否有人知道可能导致此问题的原因? 即我怀疑它是一个错误(并且已经报告过它),但这意味着有一些聪明的事情,PowerShell可能会以不同的方式工作,具体取决于是否要显示输出/导致量子像效果;所以它不仅仅是按顺序运行命令,而是在封面下进行一些(de)优化。
我的环境
操作系统:MS Windows 7 Pro SP1
$PSVersionInfo
:
Name Value
---- -----
PSVersion 4.0
WSManStackVersion 3.0
SerializationVersion 1.1.0.1
CLRVersion 4.0.30319.18444
BuildVersion 6.3.9600.16406
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0}
PSRemotingProtocolVersion 2.2
MS Connect Bug
答案 0 :(得分:1)
我在运行带有和不带Test-Connection
开关参数的Quiet
时执行了Wireshark跟踪,为Computername
参数提供了IPv4地址。
当省略Quiet
开关时,PowerShell似乎不会向目标机器发送1个,而是6个NetBIOS名称查询,之后它将返回格式化的输出。
如果我分配 Test-Connection
的输出,它会立即返回,但只要我将其传递给Format-Table
,它就会挂起并再次发送NBSTAT查询< / p>
根本原因实际上不是Test-Connection
cmdlet本身,而是格式化输出。其中一个属性(IPV4Address
)是ScriptProperty
,其定义如下:
PS C:\> $ping = Test-Connection -ComputerName 10.0.0.101 -Count 1
PS C:\> Get-Member -InputObject $ping -Name IPV4Address | Select-Object -ExpandProperty Definition
System.Object IPV4Address {get=$iphost = [System.Net.Dns]::GetHostEntry($this.address)
$iphost.AddressList | ?{ $_.AddressFamily -eq [System.Net.Sockets.AddressFamily]::InterNetwork } | select -first 1;}
因此,当显示输出时,调用[System.Net.Dns]::GetHostEntry(10.0.0.101)
来计算IPV4Address
- 这就是导致等待时间的原因
如果您不关心IP地址的模拟解决方案,请使用Select-Object
来阻止IPV4Address
的计算和输出:
Test-Connection -ComputerName 10.0.0.101 -Count 1 | Select Address,StatusCode