在重置之前测试无线适配器是否正常工作

时间:2016-08-03 07:54:51

标签: networking windows-7-x64 powershell-v4.0 wireless-connection control-panel

是否有一种简单的方法可以证明网络适配器是否正常工作?也许有些像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的机器,有时候我会在其他地方。 ..因此确定一个好的目标候选者来测试我的网络适配器是否需要通过ping一些外部设备来重新启动比理想情况更复杂。

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

1 个答案:

答案 0 :(得分:0)

似乎WMI类Win32_NetworkAdapter具有Availability属性。 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
}