Ein- / Ausschalten des Bluetooth-Radios / Adapters von cmd / powershell in Windows 10

28

Eine so einfache Aufgabe, würde man sagen, und ich habe keine befriedigende Lösung gefunden. Was ich versucht habe (mit Musik über einen Bluetooth-verbundenen Lautsprecher, um den Zustand des Radios wirklich zu kennen):

  • mit devcon als admin: devcon disable USB\VID_8087&PID_07DC&REV_0001(das ist die HW-ID meines Bluetooth-Adapters) ... erfordert einen Neustart, um zu funktionieren ...
  • Verwenden von Powershell als Administrator: Disable-NetAdapter "Bluetooth Network Connection 3"(das ist die Übersetzung des Namens meines Bluetooth-Adapters) ... Der PAN-Treiber wird deaktiviert, aber ein Bluetooth-Lautsprecher spielt weiterhin Musik ab.
  • Verwenden von net als Admin: net stop bthserv... schaltet das Radio nicht aus (BT-Lautsprecher spielt weiterhin Musik ab)
  • Verwenden von .NET: Die relevanteste Seite in MSDN sagt nichts über das Ein- und Ausschalten des Adapters aus.
  • Explorer verwenden: ms-settings:bluetoothoder explorer.exe %LocalAppData%\Packages\windows.immersivecontrolpanel_cw5n1h2txyewy\LocalState\Indexed\Settings\cs-CZ\AAA_SettingsPagePCSystemBluetooth.settingcontent-ms... öffnet das Bluetooth-Einstellungsfeld, aber ich muss immer noch auf den Umschalter klicken

Ich kann nicht glauben, dass Microsoft so unwissend wäre, einen solchen Befehl nicht bereitzustellen ...

Martin Pecka
quelle
Wie spielst du die Musik?
Harrymc
Using Winamp :)
Martin Pecka
Stoppt das Töten von Winamp die Musik?
Harrymc
Natürlich, warum würde es nicht? Es geht aber nicht darum, die Musikwiedergabe zu stoppen, sondern um die Steuerung des BT-Radios.
Martin Pecka
1
@harrymc Lies die Frage bitte. Die Musikwiedergabe ist nur eine Möglichkeit, um festzustellen, ob die Bluetooth-Verbindung aktiv ist oder nicht. Was mich wirklich interessiert, ist eine Möglichkeit, den Bluetooth-Adapter zu deaktivieren / aktivieren.
Martin Pecka

Antworten:

21

Dies ist aufgrund der erforderlichen Interoperation mit WinRT eine Herausforderung, aber in reiner PowerShell ist Folgendes möglich:

[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

Um es zu verwenden, speichern Sie es als PS1-Datei, z bluetooth.ps1. Wenn Sie dies noch nicht getan haben, befolgen Sie die Anweisungen im Abschnitt "Aktivieren von Skripten" des PowerShell-Tag-Wikis , um die Ausführung von Skripten auf Ihrem System zu aktivieren. Dann können Sie es an einer PowerShell-Eingabeaufforderung wie folgt ausführen:

.\bluetooth.ps1 -BluetoothStatus On

Um Bluetooth auszuschalten, übergeben Sie Offstattdessen.

So führen Sie es aus einer Batchdatei aus:

powershell -command .\bluetooth.ps1 -BluetoothStatus On

Vorsichtsmaßnahme: Wenn der Bluetooth-Supportdienst nicht ausgeführt wird, versucht das Skript, ihn zu starten, da WinRT andernfalls keine Bluetooth-Funkgeräte erkennt. Leider kann der Dienst nicht gestartet werden, wenn das Skript nicht als Administrator ausgeführt wird. Um dies unnötig zu machen, können Sie den Starttyp dieses Dienstes in "Automatisch" ändern.

Nun zur Erklärung. Die ersten drei Zeilen legen die Parameter fest, die das Skript verwendet. Bevor wir ernsthaft beginnen, stellen wir sicher, dass der Bluetooth-Support-Dienst ausgeführt wird, und starten ihn, falls nicht. Anschließend laden System.Runtime.WindowsRuntimewir die Assembly, damit wir mit der WindowsRuntimeSystemExtensions.AsTaskMethode Aufgaben im WinRT-Stil (die .NET / PowerShell nicht versteht) in .NET konvertieren können Task. Diese bestimmte Methode verfügt über eine Schiffsladung verschiedener Parametersätze, die die Überlastungsauflösung von PowerShell auszulösen scheinen. In der nächsten Zeile erhalten wir die spezifische Methode, die nur eine erfolgreiche WinRT-Aufgabe übernimmt. Anschließend definieren wir eine Funktion, die wir mehrmals verwenden, um ein Ergebnis des entsprechenden Typs aus einer asynchronen WinRT-Task zu extrahieren. Nach der Deklaration dieser Funktion laden wir zwei notwendige Typen aus WinRT-Metadaten. Der Rest des Skripts ist so ziemlich nur eine PowerShell-Übersetzung des C # -Codes, den Sie in Ihrer Antwort geschrieben haben. Es verwendet die RadioWinRT-Klasse zum Suchen und Konfigurieren des Bluetooth-Funkgeräts.

Ben N
quelle
1
Sie können keine Methode für einen Nullwert-Ausdruck aufrufen. Unter C: \ Users \ chx \ AppData \ Local \ Microsoft \ WindowsApps \ bluetooth.ps1: 18 char: 1 + Await ($ bluetooth.SetStateAsync ($ BluetoothStatus)) ([Windows.Devices.
chx
@chx Sind Sie sicher, dass Ihr Gerät über einen Bluetooth-Adapter verfügt? Wenn kein Bluetooth-Funkgerät vorhanden ist, wird die vorletzte Zeile $bluetoothauf Null gesetzt, wodurch die vorletzte Zeile diesen Fehler verursacht.
Ben N
Ich bin mir zu 100% sicher, dass es in der App "Einstellungen" sichtbar ist und ich Musik drahtlos höre. Sowohl der Geräte-Manager als auch wmic melden dies ebenfalls.
chx
@chx Hmm, was bekommst du, wenn du die letzten drei Zeilen nur durch ersetzst $radios? Daraufhin wird die Liste der von WinRT zurückgegebenen Radios angezeigt.
Ben N
2
Clever, es geht! Ich konnte mit dieser API keine Desktop-App kompilieren, aber das dynamische Laden in ein Skript scheint der richtige Weg zu sein. Jetzt vergleiche mit rfkill unblock bluetoothunter Linux :-D
Martin Pecka
5

Nachdem ich aufgegeben hatte, nach vorgefertigten Lösungen zu suchen, stellte ich fest, dass die Universal Windows Platform-Apps Zugriff auf die Funksteuerungs-API haben .

Daher habe ich eine Beispiel-Funksteuerungs-App mit einer befehlszeilengesteuerten App zusammengeführt. Das Ergebnis ist hier: https://github.com/peci1/RadioControl . Es ist im Windows Store veröffentlicht .

Im Allgemeinen ist es nicht möglich, die App nur im Hintergrund laufen zu lassen. Sie müssen daher zuerst die GUI starten und können sie dann wie folgt über die Befehlszeile aufrufen

radiocontrol.exe 0 on
radiocontrol.exe Bluetooth off

Die Kernfunktionen, die diese App benötigt, sind:

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

Dann müssen Sie auch die Radios-Funktion zum App-Manifest hinzufügen:

<DeviceCapability Name="radios" />

Um die Steuerung über die protected override async void OnActivated(IActivatedEventArgs args)Befehlszeile zu ermöglichen, müssen Sie die Methode in App.xaml.cs überschreiben und die Verarbeitung in einer Verzweigung wie der folgenden ausführen:

switch (args.Kind)
        {
            case ActivationKind.CommandLineLaunch:
Martin Pecka
quelle
Diese Antwort passt besser zu StackOverflow.
Harrymc
@MartinPecka Wissen Sie zufällig, wie Sie Bluetooth-Hardware, die mit getrennt wurde, wieder verbinden können Disable/Enable-NetAdapter? superuser.com/questions/1444278/...
JinSnow
3

Dieses Autohotkey-Skript scheint den Trick zu tun. Das stört mich, Sleepaber es scheint, dass das Fenster aktiv wird, bevor es zum Empfang meiner Tastatureingaben bereit ist.

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

Crossposting an /programming//q/48700268/308851, um herauszufinden, durch was das ersetzt werden Sleep 300könnte.

chx
quelle
Dies könnte in den meisten Fällen auch eine Lösung sein. Ich musste auch einen kurzen Schlaf hinzufügen, nachdem ich die Tastenanschläge gesendet hatte. Und diese Lösung funktioniert nicht, wenn der Bildschirm gesperrt ist. Die oben veröffentlichte universelle Windows-App funktioniert auch mit gesperrtem Bildschirm.
Martin Pecka
2

Hier ist eine Teillösung: wmic path Win32_PNPEntity where "caption like '%bluetooth%' AND DeviceID like 'USB\\%'" call disableLässt den Bluetooth-Ein- / Ausschalter auf jeden Fall verschwinden und der Geräte-Manager meldet dies This device is disabled. (Code 22). Ob das ausreicht, um das Radio auszuschalten, weiß ich nicht.

Ich kann keine Dokumentation zu den callakzeptierten Argumenten finden . Ich denke, es sollte eine Art rfkillhier geben.

chx
quelle
Es tut mir leid, funktioniert bei mir nicht so, wie Sie es beschreiben. Für mich stoppt die Bluetooth-Wiedergabe, aber alle Bluetooth-Schalter in der Systemsteuerung bleiben eingeschaltet. Wenn Sie mit anrufen, enablewird die Bluetooth-Wiedergabe nicht fortgesetzt. Die Dokumentation zur PNPEntity-Klasse finden Sie hier: msdn.microsoft.com/en-us/library/aa394353(v=vs.85).aspx , aber es scheinen keine anderen nützlichen Methoden vorhanden zu sein ...
Martin Pecka
1

Mit DevManView können Sie ein Gerät über die Befehlszeile mit folgender Syntax aktivieren / deaktivieren:

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

Es erlaubt auch die Verwendung von Platzhaltern mit dem /use_wildcardArgument.

rahuldottech
quelle
Devmanview ist in der Tat ein nützliches Tool, aber es löst mein Problem nicht. Das Problem ist, dass es anscheinend kein Gerät gibt, das Sie im Geräte-Manager deaktivieren können, um das Bluetooth-Radio auszuschalten.
Martin Pecka
@MartinPecka Sehen Sie keine davon? i.stack.imgur.com/UrOuc.png Wenn nicht, können Sie versuchen, Treiber zu aktualisieren ...
rahuldottech
Ich sehe das Bluetooth-Gerät, aber durch Deaktivieren wird die Wiedergabe nicht gestoppt - wahrscheinlich, weil das System neu gestartet werden muss, damit es wirklich deaktiviert wird (wie in der ursprünglichen Frage angegeben).
Martin Pecka
0

Powershell verfügt über Cmdlets, mit denen Sie genau das tun können, wonach Sie suchen:

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

Verwenden Sie Get-Device, um eine Liste der Geräte abzurufen. Sie können das Where-Objekt weiterleiten, um Ihr Gerät auszuwählen, und dann an Disable-Device (Gerät deaktivieren) oder Enable-Device (Gerät aktivieren) weiterleiten.

Detaillierte Anleitung...

Laden Sie die Datei herunter und entpacken Sie sie.

Starte eine PowerShell als Admin.

Ändern Sie ggf. die Ausführungsrichtlinie:

Set-ExecutionPolicy Unrestricted

Importieren Sie das Modul:

Import-Module .\DeviceManagement.psd1

Wenn Sie die Liste der Geräte eingrenzen müssen, können Sie einen ähnlichen Vergleich durchführen:

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

Wenn Sie den genauen Namen kennen, können Sie mit -eq (gleich) vergleichen:

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

Hände an der Hose abwischen.

Apokalyske
quelle
Dadurch wird das USB-Gerät und nicht nur das Radio deaktiviert. wmickann das auch, denke ich zumindest.
chx
Bei der Frage wurde nicht gefragt, wie das Radio deaktiviert werden soll, aber nicht der Adapter. Warum die Unterscheidung? Wenn Sie mir einen guten Grund geben können, werde ich überlegen, für Sie zu graben, aber ich habe die Frage beantwortet, die gestellt wurde: "Was mich wirklich interessiert, ist wirklich eine Möglichkeit, den Bluetooth-Adapter zu deaktivieren / aktivieren. - Martin Pecka 5. Februar um 9:31 "
Apokalysque
Es tut mir leid, was ist der Unterschied zwischen Adapter und Radio? Ich halte diese beiden Begriffe für gleichwertig. Es gibt eine Menge Software-Geräte, die dieses HW-Ding bietet, und Sie haben Recht, bei dieser Frage geht es nicht um sie.
Martin Pecka
Darüber hinaus funktionieren sowohl dieses als auch das 2012 PS-Skript von Ricardo Mendes nicht mit meinem Win 10 1709 64-Bit, wie in den Kommentaren erwähnt. Beide enden mit einem Fehler Disable-Device : Error calling SetupDiCallClassInstaller. Ich führe sie als Administrator und mit uneingeschränkter Ausführungsrichtlinie aus.
Martin Pecka
0

Ich habe ein Batch-Skript erstellt, das einen Registrierungsschlüsselwert überprüft, der nur vorhanden wäre, wenn Ihr Bluetooth-Radio aktiviert wäre. Anschließend ruft es das oben stehende Powershell-Skript von Ben N mit dem richtigen Parameter auf, um den aktuellen Status zu ändern. Verwandelt es in eine Umschaltverknüpfung, anstatt es separat aktivieren und deaktivieren zu müssen.

@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
quelle
-1

Das Ausführen des folgenden Befehls über die Eingabeaufforderung (als Administrator) hat den Trick ausgeführt:

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

Ich hatte zuvor denselben Befehl zum Deaktivieren meines Wi-Fi-Adapters verwendet und festgestellt, dass er auch mit den anderen Adaptern funktioniert: Systemsteuerung> Netzwerk und Internet> Netzwerkverbindungen. Ändern Sie einfach das Argument "name" in den Namen Ihres Adapters. Sie können es auch wieder aktivieren, indem Sie das letzte Argument in ändern admin=enabled.

Micah Vertal
quelle
1
Dies scheint auch nur die PAN-Treiber zu deaktivieren, schaltet jedoch das Funkgerät selbst nicht aus (in der Systemsteuerung wird Bluetooth weiterhin als "Ein" gemeldet).
Martin Pecka
Wird jetzt durch den Bluetooth-Repro-Test überprüft. Bluetooth wird nicht ausgeschaltet.
Martin Pecka
Es tut mir leid @ peci1, ich habe deine Frage falsch verstanden. Ich habe mich zuvor mit Fragen zum Deaktivieren von Bluetooth befasst und Ihre Frage als dieselbe interpretiert. Ihr Ziel ist es also, das Bluetooth-Gerät auszuschalten (die Stromversorgung zu unterbrechen)? Ich werde ein bisschen recherchieren und dich wissen lassen, wenn ich etwas finde.
Micah Vertal
@peci1 Wäre dieser Link überhaupt hilfreich?
Micah Vertal
Nein, tut es nicht. Es geht um USB, nicht um Bluetooth-Geräte. Das verknüpfte Cmdlet "Geräteverwaltung" funktioniert ebenfalls nicht.
Martin Pecka