Увімкніть / вимкніть радіо / адаптер Bluetooth з cmd / powerhell в Windows 10


28

Таке просте завдання, можна сказати, і я не знайшов задоволеного рішення. Що я спробував (з музикою, що грає через динамік, підключений до Bluetooth, щоб справді знати стан радіо):

  • використання devcon в якості адміністратора: devcon disable USB\VID_8087&PID_07DC&REV_0001(що є HW-ідентифікатором мого Bluetooth-адаптера) ... для роботи потрібна перезавантаження ...
  • з використанням powershell як адміністратора: Disable-NetAdapter "Bluetooth Network Connection 3"(що є перекладом імені мого адаптера Bluetooth) ... він відключає драйвер PAN, але динамік Bluetooth продовжує відтворювати музику ...
  • використання мережі як адміністратора: net stop bthserv... фактично не вимикає радіо (BT-динамік продовжує відтворювати музику)
  • використання .NET: найрелевантніша сторінка в MSDN не говорить ні слова про вмикання / вимкнення адаптера.
  • за допомогою Explorer: ms-settings:bluetoothабо explorer.exe %LocalAppData%\Packages\windows.immersivecontrolpanel_cw5n1h2txyewy\LocalState\Indexed\Settings\cs-CZ\AAA_SettingsPagePCSystemBluetooth.settingcontent-ms... відкриває панель налаштувань Bluetooth, але мені все одно потрібно натиснути на тумблер

Я не можу повірити, що Microsoft буде настільки неосвіченим, щоб не надати таку команду ...


Як ти граєш музику?
harrymc

Використання Winamp :)
Мартін Печка

Чи вбивство Winamp зупиняє музику?
harrymc

Звичайно, чому б це не сталося? Але питання не в припиненні відтворення музики, а в управлінні радіо BT.
Мартін Печка

1
@harrymc Прочитайте питання, будь ласка. Відтворення музики - це лише спосіб я виявити, живий зв’язок Bluetooth чи ні. Що мене дійсно цікавить, це насправді спосіб відключення / включення адаптера Bluetooth.
Мартін Печка

Відповіді:


21

Це складно через необхідну взаємодію з WinRT, але це можливо в чистому PowerShell:

[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

Для його використання збережіть файл PS1, наприклад bluetooth.ps1. Якщо ви ще цього не зробили, дотримуйтесь інструкцій у розділі Включення сценаріїв у вікі тегів PowerShell, щоб увімкнути виконання сценаріїв у вашій системі. Тоді ви можете запустити його з підказки PowerShell так:

.\bluetooth.ps1 -BluetoothStatus On

Щоб вимкнути Bluetooth, перейдіть Offнатомість.

Щоб запустити його з пакетного файлу:

powershell -command .\bluetooth.ps1 -BluetoothStatus On

Caveat: Якщо Служба підтримки Bluetooth не працює, сценарій намагається запустити її, оскільки в іншому випадку WinRT не побачить радіо Bluetooth. На жаль, службу неможливо запустити, якщо сценарій не працює як адміністратор. Щоб зробити це непотрібним, ви можете змінити тип запуску цієї служби на автоматичний.

Тепер для деяких пояснень. Перші три рядки встановлюють параметри, які приймає сценарій. Перш ніж серйозно розпочати, ми переконуємося, що служба підтримки Bluetooth працює, і запустити її, якщо ні. Потім завантажуємо System.Runtime.WindowsRuntimeзбірку, щоб ми могли використовувати WindowsRuntimeSystemExtensions.AsTaskметод перетворення завдань у стилі WinRT (яких .NET / PowerShell не розуміє) у .NET Tasks. У цьому конкретному методі є завантаження різних наборів параметрів, які, схоже, відключають роздільну здатність перевантаження PowerShell, тому в наступному рядку ми отримуємо конкретний, який приймає лише результативне завдання WinRT. Потім ми визначаємо функцію, яку ми будемо використовувати кілька разів для отримання результату відповідного типу з асинхронної задачі WinRT. Після оголошення цієї функції ми завантажуємо два необхідні типи з метаданих WinRT. Залишок сценарію - це лише переклад PowerShell коду C #, який ви написали у своїй відповіді; він використовує Radioклас WinRT для пошуку та налаштування радіо Bluetooth.


1
Ви не можете викликати метод з нульовим виразом. У C: \ Users \ chx \ AppData \ Local \ Microsoft \ WindowsApps \ bluetooth.ps1: 18 char: 1 + Очікування ($ bluetooth.SetStateAsync ($ BluetoothStatus)) ([Windows.Devices.
chx

@chx Ви впевнені, що ваш апарат має адаптер Bluetooth? Якщо радіо Bluetooth немає, рядок третього до останнього встановить $bluetoothна нульове значення, що призведе до появи другої лінії в останній лінії.
Бен N

Я на 100% впевнений, що це видно в додатку "Налаштування", і я слухаю музику бездротово, і диспетчер пристроїв, і wmic також повідомляє про це.
chx

@chx Хм, що ви отримуєте, якщо останні три рядки замінити на просто $radios? Це покаже список радіостанцій, які WinRT повернув.
Бен N

2
Розумний, це працює! Мені просто не вдалося скласти додаток для настільних ПК за допомогою цього API, але динамічно завантажується його у сценарії. Тепер порівняйте rfkill unblock bluetoothз Linux :-D
Мартін Печка

5

Відмовившись від пошуку готових рішень, я з'ясував, що програми Universal Universal Platform мають доступ до API радіоуправління .

Тож я з’єднав зразок програми керування радіозв’язку з програмою, керованою командним рядком, і результат тут: https://github.com/peci1/RadioControl . Він опублікований в магазині Windows .

Загалом, не можна просто дозволити програмі запускатись у фоновому режимі, тому спочатку потрібно запустити графічний інтерфейс, а потім можна зателефонувати на нього з командного рядка, наприклад

radiocontrol.exe 0 on
radiocontrol.exe Bluetooth off

Основні функції, які потрібні цій програмі:

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

Тоді вам також потрібно додати можливість маніпулювання до маніфесту програми:

<DeviceCapability Name="radios" />

А щоб дозволити управління командним protected override async void OnActivated(IActivatedEventArgs args)рядком , вам потрібно переозначити метод у App.xaml.cs і виконати обробку у такій гілці:

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

Ця відповідь краще відповідає StackOverflow.
harrymc

@MartinPecka Випадково ви знаєте, як підключити апаратне забезпечення Bluetooth, яке було відключено за допомогою Disable/Enable-NetAdapter? superuser.com/questions/1444278/…
JinSnow

3

Цей сценарій автоматичної клавіші, здається, робить свою справу. Мене це турбує, Sleepале, здається, вікно стає активним, перш ніж воно буде готове приймати мої натискання клавіш.

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

Перехрещений на /programming//q/48700268/308851, щоб зрозуміти, чим це Sleep 300можна замінити.


Це також може бути рішенням у більшості випадків. Мені потрібно було також додати короткий сон після відправлення натискань клавіш. І це рішення не працює, якщо екран заблокований. Універсальний додаток Windows, який я розмістив вище, працює навіть із заблокованим екраном.
Мартін Печка,

2

Ось часткове рішення: wmic path Win32_PNPEntity where "caption like '%bluetooth%' AND DeviceID like 'USB\\%'" call disableбезумовно, змушує перемикач включення / вимкнення Bluetooth зникати, а Диспетчер пристроїв звітує This device is disabled. (Code 22). Чи достатньо це для вбивства радіо, я не впевнений.

Я не можу знайти документацію щодо того, які аргументи callприймає. Я думаю, тут має бути якесь rfkill.


Вибачте, це не працює для мене, як ви описуєте це. Для мене відтворення Bluetooth припиняється, але всі перемикачі Bluetooth на панелі управління залишаються увімкненими. А enableвідтворення за допомогою не відтворює Bluetooth. Документація до класу PNPEntity тут: msdn.microsoft.com/en-us/library/aa394353(v=vs.85).aspx , але інших корисних методів, здається, немає ...
Мартін Печка,

1

Ви можете використовувати DevManView для вмикання / відключення пристрою з командного рядка за допомогою цього синтаксису:

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

Це також дозволяє використовувати підстановку з /use_wildcardаргументами.


Devmanview - це справді корисний інструмент, але це не вирішує мою проблему. Проблема полягає в тому, що, здається, не існує пристрою, який можна було б відключити в диспетчері пристроїв, щоб вимкнути Bluetooth-радіо.
Мартін Печка

@MartinPecka Ви нічого з цього не бачите? i.stack.imgur.com/UrOuc.png Якщо ні, ви можете спробувати оновити драйвери ...
rahuldottech

Я бачу пристрій Bluetooth, але відключення його не зупиняє відтворення - можливо, тому, що систему потрібно перезапустити, щоб вона справді була відключена (як зазначено в початковому запитанні).
Мартін Печка

0

У Powershell є командлети для того, щоб робити саме те, що ви прагнете:

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

Використовуйте Get-Device, щоб отримати список пристроїв. Ви можете передати це через об’єкт де, щоб вибрати свій пристрій, а потім передати його на Disable-Device або Enable-Device.

Детальні інструкції ...

Завантажте та розпакуйте файл.

Запустіть панель повноважень як адміністратор.

Змініть політику виконання, якщо необхідно:

Set-ExecutionPolicy Unrestricted

Імпорт модуля:

Import-Module .\DeviceManagement.psd1

Якщо вам потрібно звузити список пристроїв, ви можете використовувати порівняння -подобне:

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

Якщо ви знаєте точну назву, ви можете використовувати порівняння -eq (рівне):

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

Витріть руки на штани.


Це відключить USB-пристрій, а не лише радіо. wmicможна це зробити, принаймні я так думаю.
chx

Питання не задавало питання, як відключити радіо, але не адаптер. Чому відмінність? Якщо ви можете дати мені вагомий привід, я розглядаю питання про копання для вас, але я відповів на питання, яке мені задали "Що мене дійсно цікавить, це дійсно спосіб відключити / включити адаптер Bluetooth. - Martin Pecka, 5 лютого в 9:31 "
апокаліск

Вибачте, яка різниця між адаптером і радіо? Я вважаю ці два терміни рівнозначними. Програмне забезпечення пристроїв, що надається цим обладнанням ***, є ***, і ви праві, це питання не про них.
Мартін Печка

Більше того, і цей, і сценарій PS в 2012 році від Рікардо Мендеса не працюють на моєму Win 10 1709 64bit, про що йдеться у їхніх коментарях. Обидва закінчуються помилкою Disable-Device : Error calling SetupDiCallClassInstaller. Я запускаю їх як адміністратор і з необмеженою політикою виконання.
Мартін Печка

0

Я створив пакетний сценарій, який перевіряє значення ключового рег., Яке було б на місці, тільки якщо ваше радіо Bluetooth було включено. Потім він викликає вищевказаний сценарій Ben N з правильним параметром для переключення його поточного стану. Перетворює його в ярлик швидкого переключення, а не використовувати ввімкнення та вимкнення окремо.

@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

-1

Виконавши таку команду з командного рядка (як адміністратор) зробив свою справу:

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

Раніше я використовував ту саму команду, щоб відключити адаптер Wi-Fi, і виявив, що вона також працює з іншими адаптерами в: Панель управління> Мережа та Інтернет> Мережеві з'єднання. Просто змініть аргумент "ім'я" на ім'я вашого адаптера. Ви також можете ввімкнути його знову, змінивши останній аргумент на admin=enabled.


1
Здається, це просто відключить драйвери PAN, але не вимикає сам радіопристрій (на панелі управління Bluetooth все ще повідомляється як "увімкнено").
Мартін Печка

Підтверджений зараз тестом bluetooth repro, Bluetooth не вимикає.
Мартін Печка

Вибачте @ peci1, я неправильно зрозумів ваше запитання. Раніше я розглядав питання, пов’язані з відключенням Bluetooth, і тлумачив ваше запитання як те саме. Отже, ваша мета - вимкнути ( вимкнути живлення) пристрій Bluetooth? Я трохи вивчу і дам вам знати, якщо я щось знайду.
Micah Vertal

@ peci1 чи корисне це посилання взагалі?
Міхей Вертал

Ні, це не є. Мова йде про USB, а не про пристрої Bluetooth. І пов'язаний керуючий пристрій управління пристроями також не працює.
Мартін Печка
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.