Saltar al contenido

Activar/desactivar radio/adaptador Bluetooth desde cmd/powershell en Windows 10

Siéntete en la libertad de divulgar nuestra web y códigos con otro, danos de tu ayuda para hacer crecer nuestra comunidad.

Solución:

Esto es un desafío debido a la interoperabilidad necesaria 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) 
[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 en un archivo PS1, por ejemplo bluetooth.ps1. Si aún no lo ha hecho, siga las instrucciones en la sección Habilitación de secuencias de comandos de la wiki de etiquetas de PowerShell para habilitar la ejecución de secuencias de comandos en su sistema. Luego puede ejecutarlo desde un indicador de PowerShell como este:

.bluetooth.ps1 -BluetoothStatus On

Para desactivar Bluetooth, pase Off en lugar de.

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 eso no sea necesario, 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 soporte de Bluetooth se esté ejecutando y, si no, lo iniciamos. 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 Tasks. Ese método en particular tiene una gran cantidad de diferentes conjuntos de parámetros que parecen tropezar con la resolución de sobrecarga de PowerShell, por lo que en la siguiente línea obtenemos el específico que solo toma una tarea de WinRT resultante. Luego definimos una función que usaremos varias veces para extraer un resultado del tipo apropiado de una tarea WinRT asincrónica. Siguiendo la declaración de esa función, cargamos dos tipos necesarios de los 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; usa el Radio Clase WinRT para encontrar y configurar la radio Bluetooth.

Después de dejar de buscar soluciones listas para usar, descubrí que las aplicaciones de la plataforma universal de Windows tienen acceso a la API de control de radio.

Así que fusioné una aplicación de control de radio de muestra con una aplicación controlada por línea de comandos y el resultado está aquí: https://github.com/peci1/RadioControl. Está publicado en la Tienda Windows.

En general, no es posible dejar que la aplicación se ejecute en segundo plano, por lo que primero debe iniciar la GUI y luego puede llamarla desde la línea de comandos como

radiocontrol.exe 0 on
radiocontrol.exe Bluetooth off

Las características principales que necesita esta aplicación son:

using Windows.Devices.Radios;
await Radio.RequestAccessAsync();
var radios = await Radio.GetRadiosAsync();
await radios[0].SetStateAsync(RadioState.On);

Luego, también debe agregar la capacidad Radios al manifiesto de la aplicación:


Y para permitir el control desde la línea de comandos, debe anular el método protected override async void OnActivated(IActivatedEventArgs args) en App.xaml.cs y realice el procesamiento en una rama como esta:

switch (args.Kind)
        {
            case ActivationKind.CommandLineLaunch:

Este script de Autohotkey parece funcionar. me molesta la Sleep allí, pero parece que la ventana se activa antes de que esté lista para recibir mis pulsaciones de teclas.

SendMode Input
Run, ms-settings:bluetooth
WinWaitActive, Settings
Sleep 300
Send,TabSpace
WinClose, A

Cruzado a https://stackoverflow.com/q/48700268/308851 para averiguar qué es eso Sleep 300 podría ser reemplazado por.

Reseñas y valoraciones del tutorial

Recuerda que tienes concesión de glosar tu experiencia si diste con la respuesta.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *