Esto es desafiante debido a la necesaria interoperación con WinRT, pero es posible en PowerShell puro:
[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
Para usarlo, guárdelo es un archivo PS1, por ejemplo bluetooth.ps1
. Si aún no lo ha hecho, siga las instrucciones en la sección Habilitación de scripts de la wiki de etiquetas de PowerShell para habilitar la ejecución de scripts en su sistema. Luego puede ejecutarlo desde un indicador de PowerShell como este:
.\bluetooth.ps1 -BluetoothStatus On
Para desactivar Bluetooth, pasa en su Off
lugar.
Para ejecutarlo desde un archivo por lotes:
powershell -command .\bluetooth.ps1 -BluetoothStatus On
Advertencia: si el servicio de soporte de Bluetooth no se está ejecutando, el script intenta iniciarlo porque de lo contrario, WinRT no verá las radios de Bluetooth. Por desgracia, el servicio no se puede iniciar si el script no se ejecuta como administrador. Para que sea innecesario, puede cambiar el tipo de inicio de ese servicio a automático.
Ahora para alguna explicación. Las primeras tres líneas establecen los parámetros que toma el script. Antes de comenzar en serio, nos aseguramos de que el servicio de asistencia Bluetooth se esté ejecutando y lo iniciamos si no. Luego cargamos el System.Runtime.WindowsRuntime
ensamblaje para que podamos usar el WindowsRuntimeSystemExtensions.AsTask
método para convertir tareas de estilo WinRT (que .NET / PowerShell no entiende) a .NET Task
s. Ese método en particular tiene una gran cantidad de diferentes conjuntos de parámetros que parecen disparar la resolución de sobrecarga de PowerShell, por lo que en la siguiente línea obtenemos el específico que toma solo una tarea WinRT resultante. Luego definimos una función que usaremos varias veces para extraer un resultado del tipo apropiado de una tarea WinRT asíncrona. Después de la declaración de esa función, cargamos dos tipos necesarios de metadatos de WinRT. El resto del script es más o menos una traducción de PowerShell del código C # que escribió en su respuesta; utiliza la Radio
clase WinRT para buscar y configurar la radio Bluetooth.