Una tarea tan simple, uno diría, y no he encontrado una solución satisfactoria. Lo que he intentado (con música reproduciéndose a través de un altavoz conectado por Bluetooth para saber realmente el estado de la radio):
- usando devcon como administrador:
devcon disable USB\VID_8087&PID_07DC&REV_0001
(que es la identificación HW de mi adaptador Bluetooth) ... requiere reiniciar para funcionar ... - usando powershell como administrador:
Disable-NetAdapter "Bluetooth Network Connection 3"
(que es la traducción del nombre de mi adaptador Bluetooth) ... deshabilita el controlador PAN, pero un altavoz Bluetooth continúa reproduciendo música ... - usando net como administrador:
net stop bthserv
... en realidad no apaga la radio (el altavoz BT continúa reproduciendo música) - usando .NET: la página más relevante en MSDN no dice una palabra acerca de cómo encender / apagar el adaptador.
- usando explorer:
ms-settings:bluetooth
oexplorer.exe %LocalAppData%\Packages\windows.immersivecontrolpanel_cw5n1h2txyewy\LocalState\Indexed\Settings\cs-CZ\AAA_SettingsPagePCSystemBluetooth.settingcontent-ms
... abre el panel de configuración de Bluetooth, pero aún tengo que hacer clic en el botón
No puedo creer que Microsoft sea tan ignorante para no proporcionar ese comando ...
windows
windows-10
command-line
bluetooth
Martin Pecka
fuente
fuente
Respuestas:
Esto es desafiante debido a la necesaria interoperación con WinRT, pero es posible en PowerShell puro:
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:Para desactivar Bluetooth, pasa en su
Off
lugar.Para ejecutarlo desde un archivo por lotes:
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 elWindowsRuntimeSystemExtensions.AsTask
método para convertir tareas de estilo WinRT (que .NET / PowerShell no entiende) a .NETTask
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 laRadio
clase WinRT para buscar y configurar la radio Bluetooth.fuente
$bluetooth
en nula, lo que hará que la penúltima línea produzca ese error.$radios
? Eso mostrará la lista de radios que WinRT devolvió.rfkill unblock bluetooth
Linux :-DDespués de rendirme para buscar soluciones ya hechas, 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
Las características principales que necesita esta aplicación son:
Luego, también debe agregar la capacidad de 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 hacer el procesamiento en una rama como esta:fuente
Disable/Enable-NetAdapter
? superuser.com/questions/1444278/...Este script de Autohotkey parece hacer el truco.
Sleep
Allí me molesta, pero parece que la ventana se activa antes de que esté lista para recibir mis pulsaciones de teclas.Crossposted a /programming//q/48700268/308851 para averiguar con qué
Sleep 300
podría reemplazarse.fuente
Aquí hay una solución parcial:
wmic path Win32_PNPEntity where "caption like '%bluetooth%' AND DeviceID like 'USB\\%'" call disable
ciertamente hace que el interruptor de encendido / apagado de Bluetooth desaparezca e informes del Administrador de dispositivosThis device is disabled. (Code 22)
. Si eso es suficiente para matar la radio, no estoy seguro.No puedo encontrar documentación sobre qué argumentos
call
acepta. Creo que debería haber algún tipo derfkill
aquí.fuente
enable
no reanuda la reproducción de Bluetooth. La documentación sobre la clase PNPEntity está aquí: msdn.microsoft.com/en-us/library/aa394353(v=vs.85).aspx , pero parece que no hay otros métodos útiles ...Puede usar DevManView para habilitar / deshabilitar un dispositivo desde la línea de comandos usando esta sintaxis:
También permite el uso de comodines con el
/use_wildcard
argumento.fuente
Powershell tiene cmdlets para hacer exactamente lo que estás buscando:
https://gallery.technet.microsoft.com/PowerShell-Device-60d73bb0
Use Get-Device para obtener una lista de los dispositivos. Puede canalizarlo a través de where-object para elegir su dispositivo y luego canalizarlo a Disable-Device o Enable-Device.
Instrucciones detalladas...
Descargue y descomprima el archivo.
Inicie un PowerShell como administrador.
Cambie la política de ejecución si es necesario:
Importar el módulo:
Si necesita reducir la lista de dispositivos, puede usar una comparación similar:
Si conoce el nombre exacto, puede usar una comparación -eq (igual):
Limpie las manos en los pantalones.
fuente
wmic
puede hacer esto también, al menos eso creo.Disable-Device : Error calling SetupDiCallClassInstaller
. Los ejecuto como administrador y con una política de ejecución sin restricciones.Hice un script por lotes que verifica un valor de clave reg que solo estaría en su lugar si su radio bluetooth estuviera habilitada. Luego llama al script de PowerShell de Ben N anterior con el parámetro correcto para cambiar su estado actual. Lo convierte en un acceso directo de palanca, en lugar de tener que usarlo por separado.
fuente
Ejecutar el siguiente comando desde el símbolo del sistema (como administrador) hizo el truco:
Anteriormente había usado el mismo comando para deshabilitar mi adaptador Wi-Fi, y descubrí que también funcionaba con los otros adaptadores en: Panel de control> Red e Internet> Conexiones de red. Simplemente cambie el argumento "nombre" al nombre de su adaptador. También puede habilitarlo nuevamente cambiando el último argumento a
admin=enabled
.fuente