1

有没有一种简单的方法来证明网络适配器是否工作?也许有一些像localhost(127.0.0.1)这样的IP,无论我连接到哪个网络,它总是可用的;只有一个只显示我的无线网络适配器的工作?或者也许有一些简单的诊断检查来证实这一点?测试无线适配器是否在复位前工作

我将这个问题标记为PowerShell,因为这是我的首选语言;但我可以想出方法来与可能建议的任何其他解决方案集成。

试过到目前为止

我想检查适配器的属性,发现有一个状态和IP;我想,如果有一个分配的IP或连接状态,证明所有的工作;可悲的是这些属性是blankunknown,所以我不能使用它们。

$adapter = Get-WmiObject -Class Win32_NetworkAdapter | Where-Object {$_.Name -like '*Wireless*'} 
$adapter.Status #returns 2; i.e. unknown 
$adapter.NetworkAddresses #is blank 

背景

我有,我冬眠我的笔记本电脑,同时停靠的问题,然后将它重新联机不再停靠它失去了它的无线连接,并要求该适配器重新启动。在这篇文章中提到了同样的问题:Command/Powershell script to reset a network adapter

我希望能够使用上面的代码,通过安排任务在我的计算机停止运行时运行来解决问题(例如https://superuser.com/a/149924/156700)。

有时候,我会在我的家庭网络,其中以平安的唯一设备是我的路由器上,有时我会在我的办公室网络中,其中有一个范围内的机器,我可以ping通的,有时我会在别处...因此,确定一个好的目标候选人,以测试我的网络适配器是否需要通过ping某些外部设备来重新启动比理想更复杂。

我想在重置之前运行测试,以便只在需要时重置。如果我希望对需要网络存在的其他任务进行排队,那么检查一次重置完成也将很有用。

+0

注:我只是意识到,尽管这曾告诉过我的状态2的文章=未知,文章说'status',但形象地说'availability';这是我需要的财产! http://rickgaribay.net/archive/2008/09/26/using-powershell-to-manage-network-interfaces-and-windows-services.aspx – JohnLBevan

回答

0

看来WMI类Win32_NetworkAdapterAvailability属性。 https://msdn.microsoft.com/en-us/library/aa394216(v=vs.85).aspx

有一系列可能代表“工作”的值;现在我已经走了只有状态3;即所有事情按预期100%工作/不存在潜在降级问题。根据情况,这可能是值得修改的。

function Test-NetworkAdapter { 
    [CmdletBinding()] 
    param (
     [Parameter(Mandatory = $true)] 
     [string]$AdapterNameMask  
     , 
     [Parameter(Mandatory = $false)] 
     [int[]]$HealthyStatusses = @(3) #100% working on full power; for list of other possible values, see https://msdn.microsoft.com/en-us/library/aa387884(v=vs.85).aspx 
    ) 
    process { 
     Get-WmiObject -Class Win32_NetworkAdapter ` 
     | Where-Object {$_.Name -like $AdapterNameMask} ` 
     | Select-Object @{Name='Working';Expression={$healthyStatusses -contains $_.Availability}} 
    } 
} 
function Reset-NetworkAdapter { 
    [CmdletBinding()] 
    param (
     [Parameter(Mandatory = $true)] 
     [string]$AdapterNameMask 
    ) 
    process { 
     Get-WmiObject -Class Win32_NetworkAdapter ` 
     | Where-Object {$_.Name -like $AdapterNameMask} ` 
     | %{ #in case multiple matches, loop through all 
      $_.Disable() 
      $_.Enable()  
     } 
    } 
} 

[string]$wirelessAdapterMask = '*Wireless*' 
#I could probably improve this to cope better should there be multiple matches/only resetting those with issues... but for now this meets my requirement 
if (-not (Test-NetworkAdapter $wirelessAdapterMask)) { 
    Reset-NetworkAdapter $wirelessAdapterMask 
}