如何用WinRT API编写PowerShell脚本控制WiFi或蓝牙开关?
用PowerShell通过WinRT API控制WiFi/蓝牙无线电状态
我编写了一款PowerShell脚本,借助Windows.Devices.Radios命名空间与WinRT API,可在Windows系统中以编程方式启用或禁用WiFi或蓝牙无线电。脚本已处理WinRT API的异步特性,能流畅完成无线电状态切换。
实现代码
# 加载WinRT相关组件 Add-Type -AssemblyName System.Runtime.WindowsRuntime $asTaskGeneric = ([System.WindowsRuntimeSystemExtensions].GetMethods() | Where-Object { $_.Name -eq 'AsTask' -and $_.GetParameters().Count -eq 1 -and $_.GetParameters()[0].ParameterType.Name -eq 'IAsyncOperation`1' })[0] function Await($WinRtTask, $ResultType) { $asTask = $asTaskGeneric.MakeGenericMethod($ResultType) $netTask = $asTask.Invoke($null, @($WinRtTask)) $netTask.Wait(-1) | Out-Null $netTask.Result } # 获取指定类型的无线电 function Get-Radio { param( [Parameter(Mandatory=$true)] [Windows.Devices.Radios.RadioKind]$RadioKind ) $radiosOperation = [Windows.Devices.Radios.Radio]::GetRadiosAsync() $radios = Await $radiosOperation ([System.Collections.Generic.IReadOnlyList[Windows.Devices.Radios.Radio]]) return $radios | Where-Object { $_.Kind -eq $RadioKind } } # 切换无线电状态 function Set-RadioState { param( [Parameter(Mandatory=$true)] [Windows.Devices.Radios.Radio]$Radio, [Parameter(Mandatory=$true)] [Windows.Devices.Radios.RadioState]$TargetState ) if ($Radio.State -eq $TargetState) { Write-Host "无线电已处于$TargetState状态" return } $operation = $Radio.SetStateAsync($TargetState) Await $operation ([Windows.Devices.Radios.RadioAccessStatus]) Write-Host "无线电状态已切换至$TargetState" } # 示例:禁用WiFi $wifiRadio = Get-Radio -RadioKind WiFi if ($wifiRadio) { Set-RadioState -Radio $wifiRadio -TargetState Disabled } else { Write-Host "未找到WiFi无线电设备" } # 示例:启用蓝牙 $bluetoothRadio = Get-Radio -RadioKind Bluetooth if ($bluetoothRadio) { Set-RadioState -Radio $bluetoothRadio -TargetState Enabled } else { Write-Host "未找到蓝牙无线电设备" }
关键说明
- 异步处理:通过自定义
Await函数将WinRT的异步操作转换为同步等待,解决PowerShell对WinRT异步API的兼容问题 - 权限要求:脚本需要以管理员权限运行,否则可能无法修改无线电状态
- 状态判断:切换前会检查当前状态,避免重复操作
内容的提问来源于stack exchange,提问作者Carsten
相关产品推荐
相关产品推荐

