Liga / desliga o rádio / adaptador Bluetooth do cmd / powershell no Windows 10

21

Uma tarefa tão simples, dir-se-ia, e não encontrei uma solução satisfatória. O que eu tentei (com a música tocando em um alto-falante conectado via Bluetooth para realmente saber o estado do rádio):

  • usando o devcon como admin: devcon disable USB\VID_8087&PID_07DC&REV_0001 (que é o ID do HW do meu adaptador Bluetooth) ... requer reinicialização para funcionar ...
  • usando o powershell como admin: Disable-NetAdapter "Bluetooth Network Connection 3" (que é a tradução do nome do meu adaptador Bluetooth) ... desativa o driver PAN, mas um alto-falante Bluetooth continua tocando música ...
  • usando a rede como administrador: net stop bthserv ... na verdade não desliga o rádio (o alto-falante BT continua tocando música)
  • usando o .NET: A página mais relevante no MSDN não diz uma palavra sobre como ligar / desligar o adaptador.
  • usando o explorer: ms-settings:bluetooth ou explorer.exe %LocalAppData%\Packages\windows.immersivecontrolpanel_cw5n1h2txyewy\LocalState\Indexed\Settings\cs-CZ\AAA_SettingsPagePCSystemBluetooth.settingcontent-ms ... abre o painel de configurações do Bluetooth, mas ainda preciso clicar na alternância

Eu não posso acreditar que a Microsoft seria tão ignorante em não fornecer tal comando ...

    
por Martin Pecka 18.01.2017 / 00:19

9 respostas

10

Isso é desafiador devido à interoperação necessária com o WinRT, mas é possível no 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) | 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

Para usá-lo, salve-o é um arquivo PS1, por exemplo, %código%. Se você ainda não o fez, siga as instruções na seção Habilitando Scripts do wiki de tags do PowerShell para ativar a execução de scripts no seu sistema. Então você pode executá-lo a partir de um prompt do PowerShell assim:

.\bluetooth.ps1 -BluetoothStatus On

Para desativar o Bluetooth, passe bluetooth.ps1 .

Para executá-lo a partir de um arquivo em lotes:

powershell -command .\bluetooth.ps1 -BluetoothStatus On

Advertência: Se o Serviço de Suporte Bluetooth não estiver em execução, o script tentará iniciá-lo porque, caso contrário, o WinRT não verá rádios Bluetooth. Infelizmente, o serviço não pode ser iniciado se o script não estiver sendo executado como administrador. Para tornar isso desnecessário, você pode alterar o tipo de inicialização desse serviço para automático.

Agora, para alguma explicação. As três primeiras linhas estabelecem os parâmetros do script. Antes de começarmos a sério, garantimos que o Serviço de Suporte Bluetooth esteja em execução e inicie-o, caso contrário. Em seguida, carregamos o conjunto Off para que possamos usar o System.Runtime.WindowsRuntime método para converter tarefas no estilo WinRT (que o .NET / PowerShell não entende) para o .NET WindowsRuntimeSystemExtensions.AsTask s. Esse método em particular tem uma carga de diferentes conjuntos de parâmetros que parecem atrapalhar a resolução de sobrecarga do PowerShell, portanto, na próxima linha, obtemos o específico que leva apenas uma tarefa WinRT resultante. Em seguida, definimos uma função que usaremos várias vezes para extrair um resultado do tipo apropriado de uma tarefa assíncrona do WinRT. Após a declaração dessa função, nós carregamos dois tipos necessários dos metadados do WinRT . O restante do script é basicamente apenas uma tradução do PowerShell do código C # que você escreveu em sua resposta; Ele usa a classe Task WinRT para localizar e configurar o Bluetooth rádio.

    
por 09.02.2018 / 00:42
2

Este script Autohotkey parece fazer o truque. Estou incomodado com o Sleep lá, mas parece que a janela se torna ativa antes de estar pronta para receber as minhas teclas digitadas.

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

Crosspostado para o link para descobrir com que Sleep 300 poderia ser substituído.

    
por 09.02.2018 / 07:50
2

Depois de desistir de procurar soluções prontas, descobri que os aplicativos da Plataforma Universal do Windows têm acesso ao API de controle de rádio .

Então eu mesclei um exemplo de aplicativo de controle de rádio com um aplicativo controlado por linha de comando, e o resultado está aqui: link . É publicado na Windows Store .

Em geral, não é possível permitir que o aplicativo seja executado em segundo plano, portanto, primeiro é necessário iniciar a GUI e chamá-la a partir da linha de comando, como

radiocontrol.exe 0 on
radiocontrol.exe Bluetooth off

Os principais recursos que este aplicativo precisa são:

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

Depois, você também precisa adicionar o recurso Rádios ao manifesto do aplicativo:

<DeviceCapability Name="radios" />

E para permitir o controle a partir da linha de comando, você precisa substituir o método protected override async void OnActivated(IActivatedEventArgs args) no App.xaml.cs e fazer o processamento em um ramo como este:

switch (args.Kind)
        {
            case ActivationKind.CommandLineLaunch:
    
por 05.02.2018 / 04:31
1

Aqui está uma solução parcial: wmic path Win32_PNPEntity where "caption like '%bluetooth%' AND DeviceID like 'USB\%'" call disable certamente faz com que o botão Bluetooth On / Off desapareça e o Gerenciador de dispositivos reporta This device is disabled. (Code 22) . Se isso é suficiente para matar o rádio, não tenho certeza.

Não consigo encontrar documentação sobre quais argumentos call aceita. Eu acho que deveria haver algum tipo de rfkill aqui.

    
por 04.02.2018 / 10:21
0

O Powershell tem cmdlets para fazer exatamente o que você está procurando:

link

Use Get-Device para obter uma lista dos dispositivos. Você pode canalizar isso através do where-object para escolher o seu dispositivo e depois canalizar isso para Disable-Device ou Enable-Device.

Instruções detalhadas ...

Faça o download e descompacte o arquivo.

Inicie um powershell como administrador.

Altere a política de execução, se necessário:

Set-ExecutionPolicy Unrestricted

Importe o módulo:

Import-Module .\DeviceManagement.psd1

Se você precisar restringir a lista de dispositivos, use uma comparação semelhante:

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

Se você sabe o nome exato, você pode usar uma comparação -eq (igual):

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

Limpe as mãos nas calças.

    
por 09.02.2018 / 03:25
0

Você pode usar o DevManView para ativar / desativar um dispositivo na linha de comando usando esta sintaxe:

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

Ele também permite o uso de curingas com o argumento /use_wildcard .

    
por 09.02.2018 / 17:09
0

Eu fiz um script em lote que verifica um valor de chave reg que só estaria em vigor se o seu rádio bluetooth estivesse ativado. Em seguida, ele chama o script powershell de Ben N acima com o parâmetro correto para alternar seu estado atual. Transforma-o em um atalho de alternância, em vez de ter que usar on e off separadamente.

@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
    
por 13.05.2018 / 06:22
0

Acho que posso ter a resposta para você, mas meu dispositivo Corporate Win10 está bloqueado. Isso deve ser uma alteração no valor da chave do Registro, portanto, execute o CMD como Admin e consulte a chave, em seguida, use REG DELETE e ADD para alterar o valor que deve desativar e ativar o serviço.

Ou você pode escrever um arquivo .reg de texto simples para sobrescrever os valores da chave, mas precisaria de direitos de administrador para executar.

De qualquer forma, acredito que você tenha as habilidades necessárias para descobrir isso.

Boa sorte,

Jay

    
por 01.11.2018 / 13:53
-1

A execução do seguinte comando do Prompt de Comando (como administrador) funcionou:

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

Já usei o mesmo comando para desativar meu adaptador Wi-Fi e descobri que ele também funcionava com os outros adaptadores em: Painel de controle > Rede e Internet > Conexões de rede. Apenas mude o argumento "name" para o nome do seu adaptador. Você também pode ativá-lo novamente alterando o último argumento para admin=enabled .

    
por 05.07.2017 / 17:14