Activer / désactiver la radio / l'adaptateur Bluetooth à partir de cmd / powershell dans Windows 10

28

Une tâche aussi simple, dirait-on, et je n'ai pas trouvé de solution satisfaisante. Ce que j'ai essayé (avec de la musique jouée via un haut-parleur connecté Bluetooth pour vraiment connaître l'état de la radio):

  • utiliser devcon en tant qu'administrateur: devcon disable USB\VID_8087&PID_07DC&REV_0001(qui est l'ID HW de mon adaptateur Bluetooth) ... nécessite un redémarrage pour fonctionner ...
  • en utilisant powershell en tant qu'administrateur: Disable-NetAdapter "Bluetooth Network Connection 3"(qui est la traduction du nom de mon adaptateur Bluetooth) ... cela désactive le pilote PAN, mais un haut-parleur Bluetooth continue de jouer de la musique ...
  • utiliser net en tant qu'administrateur: net stop bthserv... n'éteint pas réellement la radio (le haut-parleur BT continue de jouer de la musique)
  • en utilisant .NET: La page la plus pertinente sur MSDN ne dit pas un mot sur la mise sous / hors tension de l'adaptateur.
  • en utilisant l'explorateur: ms-settings:bluetoothou explorer.exe %LocalAppData%\Packages\windows.immersivecontrolpanel_cw5n1h2txyewy\LocalState\Indexed\Settings\cs-CZ\AAA_SettingsPagePCSystemBluetooth.settingcontent-ms... ouvre le panneau des paramètres Bluetooth, mais je dois toujours cliquer sur la bascule

Je ne peux pas croire que Microsoft serait si ignorant de ne pas fournir une telle commande ...

Martin Pecka
la source
Comment jouez-vous la musique?
harrymc
Utilisation de Winamp :)
Martin Pecka
Est-ce que tuer Winamp arrête la musique?
harrymc
Bien sûr, pourquoi ça ne le serait pas? Mais la question n'est pas d'arrêter la lecture de musique, c'est de contrôler la radio BT.
Martin Pecka
1
@harrymc Lisez la question, s'il vous plaît. La lecture de musique est juste un moyen de détecter si la connexion Bluetooth est active ou non. Ce qui m'intéresse vraiment, c'est vraiment un moyen de désactiver / activer l'adaptateur Bluetooth.
Martin Pecka

Réponses:

21

C'est difficile en raison de l'interopérabilité nécessaire avec WinRT, mais cela est possible dans PowerShell pur:

[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

Pour l'utiliser, enregistrez-le est un fichier PS1, par exemple bluetooth.ps1. Si vous ne l'avez pas déjà fait, suivez les instructions de la section Activation des scripts du wiki de balises PowerShell pour activer l'exécution des scripts sur votre système. Ensuite, vous pouvez l'exécuter à partir d'une invite PowerShell comme celle-ci:

.\bluetooth.ps1 -BluetoothStatus On

Pour désactiver Bluetooth, passez à la Offplace.

Pour l'exécuter à partir d'un fichier batch:

powershell -command .\bluetooth.ps1 -BluetoothStatus On

Avertissement: si le service d'assistance Bluetooth n'est pas en cours d'exécution, le script tente de le démarrer car sinon, WinRT ne verra pas les radios Bluetooth. Hélas, le service ne peut pas être démarré si le script ne s'exécute pas en tant qu'administrateur. Pour rendre cela inutile, vous pouvez changer le type de démarrage de ce service en automatique.

Maintenant, pour une explication. Les trois premières lignes établissent les paramètres du script. Avant de commencer sérieusement, nous nous assurons que le service d'assistance Bluetooth est en cours d'exécution et le démarrons sinon. Nous chargeons ensuite l' System.Runtime.WindowsRuntimeassembly afin de pouvoir utiliser la WindowsRuntimeSystemExtensions.AsTaskméthode pour convertir des tâches de style WinRT (que .NET / PowerShell ne comprend pas) en .NET Tasks. Cette méthode particulière a une cargaison de différents jeux de paramètres qui semblent déclencher la résolution de surcharge de PowerShell, donc dans la ligne suivante, nous obtenons celle spécifique qui ne prend qu'une tâche WinRT résultante. Ensuite, nous définissons une fonction que nous utiliserons plusieurs fois pour extraire un résultat du type approprié d'une tâche WinRT asynchrone. Après la déclaration de cette fonction, nous chargeons deux types nécessaires à partir des métadonnées WinRT. Le reste du script est à peu près juste une traduction PowerShell du code C # que vous avez écrit dans votre réponse; il utilise la Radioclasse WinRT pour rechercher et configurer la radio Bluetooth.

Ben N
la source
1
Vous ne pouvez pas appeler une méthode sur une expression de valeur nulle. Sur C: \ Users \ chx \ AppData \ Local \ Microsoft \ WindowsApps \ bluetooth.ps1: 18 char: 1 + Await ($ bluetooth.SetStateAsync ($ BluetoothStatus)) ([Windows.Devices.
chx
@chx Êtes-vous sûr que votre appareil dispose d'un adaptateur Bluetooth? S'il n'y a pas de radio Bluetooth, l'avant-dernière ligne sera définie $bluetoothsur null, ce qui provoquera l'erreur de l'avant-dernière ligne.
Ben N
Je suis sûr à 100% qu'il est visible dans l'application "Paramètres" et j'écoute de la musique sans fil et le Gestionnaire de périphériques et wmic le signalent également.
chx
@chx Hmm, qu'obtenez-vous si vous remplacez les trois dernières lignes par juste $radios? Cela affichera la liste des radios que WinRT a renvoyées.
Ben N
2
Intelligent, ça marche! Je n'ai tout simplement pas pu compiler une application de bureau à l'aide de cette API, mais le charger dynamiquement dans un script semble être la voie à suivre. Maintenant, comparez à rfkill unblock bluetoothsous Linux :-D
Martin Pecka
5

Après avoir abandonné la recherche de solutions toutes faites, j'ai découvert que les applications de la plateforme Windows universelle ont accès à l' API de contrôle radio .

J'ai donc fusionné un exemple d'application de contrôle radio avec une application contrôlée par ligne de commande, et le résultat est ici: https://github.com/peci1/RadioControl . Il est publié sur le Windows Store .

En général, il n'est pas possible de laisser l'application s'exécuter en arrière-plan, vous devez donc d'abord lancer l'interface graphique, puis vous pouvez l'appeler à partir de la ligne de commande comme

radiocontrol.exe 0 on
radiocontrol.exe Bluetooth off

Les principales fonctionnalités dont cette application a besoin sont:

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

Ensuite, vous devez également ajouter la fonction Radios au manifeste de l'application:

<DeviceCapability Name="radios" />

Et pour autoriser le contrôle à partir de la ligne de commande, vous devez remplacer la méthode protected override async void OnActivated(IActivatedEventArgs args)dans App.xaml.cs et effectuer le traitement dans une branche comme celle-ci:

switch (args.Kind)
        {
            case ActivationKind.CommandLineLaunch:
Martin Pecka
la source
Cette réponse correspond mieux à StackOverflow.
harrymc
@MartinPecka Par hasard, savez-vous comment reconnecter le matériel Bluetooth qui a été déconnecté à l'aide Disable/Enable-NetAdapter? superuser.com/questions/1444278/…
JinSnow
3

Ce script Autohotkey semble faire l'affaire. Je suis gêné par le Sleeplà - bas mais il semble que la fenêtre devienne active avant qu'elle ne soit prête à recevoir mes frappes.

SendMode Input
Run, ms-settings:bluetooth
WinWaitActive, Settings
Sleep 300
Send,{Tab}{Space}
WinClose, A

Crossposted à /programming//q/48700268/308851 pour comprendre avec quoi cela Sleep 300pourrait être remplacé.

chx
la source
Cela pourrait également être une solution dans la plupart des cas. Je devais également ajouter un bref sommeil après l'envoi des frappes. Et cette solution ne fonctionne pas si l'écran est verrouillé. L'application Windows universelle que j'ai publiée ci-dessus fonctionne même avec un écran verrouillé.
Martin Pecka, le
2

Voici une solution partielle: wmic path Win32_PNPEntity where "caption like '%bluetooth%' AND DeviceID like 'USB\\%'" call disablefait certainement disparaître le commutateur Bluetooth On / Off et les rapports du Gestionnaire de périphériques This device is disabled. (Code 22). Que ce soit suffisant pour tuer la radio, je ne suis pas sûr.

Je ne parviens pas à trouver de documentation sur les arguments callacceptés. Je pense qu'il devrait y avoir une sorte d' rfkillici.

chx
la source
Je suis désolé, ça ne marche pas pour moi comme tu le décris. Pour moi, la lecture Bluetooth s'arrête, mais tous les commutateurs Bluetooth du panneau de commande restent allumés. Et appeler avec enablene reprend pas la lecture Bluetooth. La documentation sur la classe PNPEntity est ici: msdn.microsoft.com/en-us/library/aa394353(v=vs.85).aspx , mais aucune autre méthode utile ne semble être là ...
Martin Pecka
1

Vous pouvez utiliser DevManView pour activer / désactiver un périphérique à partir de la ligne de commande en utilisant cette syntaxe:

devmanview /disable <Device Name>   
devmanview /enable <Device Name>    

Il permet également l'utilisation de caractères génériques avec l' /use_wildcardargument.

rahuldottech
la source
Devmanview est en effet un outil utile, mais il ne résout pas mon problème. Le problème est qu'il ne semble pas y avoir de périphérique que vous pouvez désactiver dans le gestionnaire de périphériques pour désactiver la radio Bluetooth.
Martin Pecka
@MartinPecka Vous ne voyez rien de tout cela? i.stack.imgur.com/UrOuc.png Sinon, vous voudrez peut-être essayer de mettre à jour les pilotes ...
rahuldottech
Je vois le périphérique Bluetooth, mais le désactiver n'interrompt pas la lecture - probablement parce que le système doit être redémarré pour qu'il devienne vraiment désactivé (comme indiqué dans la question d'origine).
Martin Pecka
0

Powershell a des applets de commande pour faire exactement ce que vous cherchez:

https://gallery.technet.microsoft.com/PowerShell-Device-60d73bb0

Utilisez Get-Device pour obtenir une liste des appareils. Vous pouvez diriger cela via where-object pour choisir votre appareil, puis diriger cela vers Disable-Device ou Enable-Device.

Des instructions détaillées...

Téléchargez et décompressez le fichier.

Démarrez un PowerShell en tant qu'administrateur.

Modifiez la politique d'exécution si nécessaire:

Set-ExecutionPolicy Unrestricted

Importez le module:

Import-Module .\DeviceManagement.psd1

Si vous avez besoin de restreindre la liste des appareils, vous pouvez utiliser une comparaison similaire:

Get-Device | Where-Object {$_.Name -like '*bluetooth*'}

Si vous connaissez le nom exact, vous pouvez utiliser une comparaison -eq (égale):

Get-Device | Where-Object {$_.Name -eq 'Martin's Bluetooth Adapter'} | Disable-Device -Confirm:$False

Essuyez les mains sur le pantalon.

apocalysque
la source
Cela désactivera le périphérique USB au lieu de simplement la radio. wmicpeut le faire aussi, du moins je le pense.
chx
La question ne demandait pas comment désactiver la radio mais pas l'adaptateur. Pourquoi cette distinction? Si vous pouvez me donner une bonne raison, je vais envisager de creuser pour vous, mais j'ai répondu à la question qui m'a été posée "Ce qui m'intéresse vraiment, c'est vraiment un moyen de désactiver / activer l'adaptateur Bluetooth. - Martin Pecka 5 février à 9:31 "
apocalysque le
Je suis désolé, quelle est la différence entre l'adaptateur et la radio? Je considère ces deux termes comme équivalents. Il y a une charge *** d'appareils logiciels que cette chose HW fournit, et vous avez raison, cette question ne les concerne pas.
Martin Pecka
De plus, cela et le script PS 2012 de Ricardo Mendes ne fonctionnent pas sur mon Win 10 1709 64bit, comme mentionné dans leurs commentaires. Les deux se retrouvent avec une erreur Disable-Device : Error calling SetupDiCallClassInstaller. Je les exécute en tant qu'administrateur et avec une politique d'exécution sans restriction.
Martin Pecka
0

J'ai fait un script batch qui vérifie une valeur de clé reg qui ne serait en place que si votre radio Bluetooth était activée. Il appelle ensuite le script powershell de Ben N ci-dessus avec le paramètre correct pour changer son état actuel. Le transforme en raccourci à bascule, plutôt que d'avoir à l'activer et le désactiver séparément.

@echo off
FOR /F "skip=2 tokens=2,*" %%A IN ('reg.exe query "HKLM\SYSTEM\CurrentControlSet\Services\bthserv\Parameters\BluetoothControlPanelTasks" /v "state"') DO set "VAR=%%B"

if %VAR%==0x1 (goto ON)

Powershell.exe -executionpolicy remotesigned -windowstyle hidden -File ".\bluetooth.ps1" -BluetoothStatus On
goto end

:ON
Powershell.exe -executionpolicy remotesigned -windowstyle hidden -File ".\bluetooth.ps1" -BluetoothStatus Off

:end
007craft
la source
-1

L'exécution de la commande suivante à partir de l'invite de commandes (en tant qu'administrateur) a fait l'affaire:

netsh interface set interface name="Bluetooth Network Connection" admin=disabled

J'avais précédemment utilisé la même commande pour désactiver mon adaptateur Wi-Fi et j'ai constaté qu'il fonctionnait également avec les autres adaptateurs dans: Panneau de configuration> Réseau et Internet> Connexions réseau. Remplacez simplement l'argument "nom" par le nom de votre adaptateur. Vous pouvez également l'activer à nouveau en remplaçant le dernier argument par admin=enabled.

Micah Vertal
la source
1
Cela semble également désactiver simplement les pilotes PAN, mais ne désactive pas le périphérique radio lui-même (dans le panneau de configuration, Bluetooth est toujours signalé comme "activé").
Martin Pecka
Vérifié maintenant par le test de repro bluetooth, ne désactive pas le bluetooth.
Martin Pecka
Je suis désolé @ peci1, j'ai mal compris votre question. J'avais précédemment examiné des questions relatives à la désactivation de Bluetooth et interprété votre question comme la même. Votre objectif est donc d' éteindre (couper l'alimentation) le périphérique Bluetooth? Je ferai des recherches un peu et je vous ferai savoir si je trouve quelque chose.
Micah Vertal
@ peci1 ce lien serait-il utile du tout?
Micah Vertal
Non. Il s'agit de périphériques USB, pas de Bluetooth. Et la cmdlet de gestion des périphériques liée ne fonctionne pas non plus.
Martin Pecka