由于与WinRT进行必要的互操作,因此具有挑战性,但是在纯PowerShell中也可以实现:
[CmdletBinding()] Param (
[Parameter(Mandatory=$true)][ValidateSet('Off', 'On')][string]$BluetoothStatus
)
If ((Get-Service bthserv).Status -eq 'Stopped') { Start-Service bthserv }
Add-Type -AssemblyName System.Runtime.WindowsRuntime
$asTaskGeneric = ([System.WindowsRuntimeSystemExtensions].GetMethods() | ? { $_.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
}
[Windows.Devices.Radios.Radio,Windows.System.Devices,ContentType=WindowsRuntime] | Out-Null
[Windows.Devices.Radios.RadioAccessStatus,Windows.System.Devices,ContentType=WindowsRuntime] | Out-Null
Await ([Windows.Devices.Radios.Radio]::RequestAccessAsync()) ([Windows.Devices.Radios.RadioAccessStatus]) | Out-Null
$radios = Await ([Windows.Devices.Radios.Radio]::GetRadiosAsync()) ([System.Collections.Generic.IReadOnlyList[Windows.Devices.Radios.Radio]])
$bluetooth = $radios | ? { $_.Kind -eq 'Bluetooth' }
[Windows.Devices.Radios.RadioState,Windows.System.Devices,ContentType=WindowsRuntime] | Out-Null
Await ($bluetooth.SetStateAsync($BluetoothStatus)) ([Windows.Devices.Radios.RadioAccessStatus]) | Out-Null
要使用它,请将其保存为PS1文件,例如bluetooth.ps1
。如果尚未安装,请按照PowerShell标签Wiki的“启用脚本”部分中的说明进行操作,以在系统上启用脚本。然后,您可以从PowerShell提示符运行它,如下所示:
.\bluetooth.ps1 -BluetoothStatus On
要关闭蓝牙,请Off
改为通过。
要从批处理文件运行它:
powershell -command .\bluetooth.ps1 -BluetoothStatus On
注意:如果蓝牙支持服务未运行,脚本将尝试启动它,因为否则,WinRT将看不到蓝牙无线电。las,如果脚本未以管理员身份运行,则无法启动服务。为了避免这种情况,您可以将该服务的启动类型更改为自动。
现在进行一些解释。前三行建立脚本采用的参数。在认真开始之前,我们确保蓝牙支持服务正在运行,如果没有运行,请启动它。然后System.Runtime.WindowsRuntime
,我们加载程序集,以便可以使用该WindowsRuntimeSystemExtensions.AsTask
方法将WinRT样式的任务(.NET / PowerShell无法理解)转换为.NETTask
。该特定方法具有一系列不同的参数集,这些参数集似乎可以提高PowerShell的重载分辨率,因此,在下一行中,我们获得了仅执行结果WinRT任务的特定方法。然后,我们定义一个函数,该函数将多次使用以从异步WinRT任务中提取适当类型的结果。根据该函数的声明,我们从WinRT元数据中加载两种必需的类型。脚本的其余部分几乎只是您在答案中编写的C#代码的PowerShell转换。它使用Radio
WinRT类来查找和配置蓝牙无线电。