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 como um arquivo PS1, por exemplo bluetooth.ps1
. Se você ainda não o fez, siga as instruções na seção Habilitando scripts do wiki de tags do PowerShell para habilitar a execução de scripts no seu sistema. Em seguida, você pode executá-lo em um prompt do PowerShell como este:
.\bluetooth.ps1 -BluetoothStatus On
Para desativar o Bluetooth, passe em seu Off
lugar.
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 algumas explicações. As três primeiras linhas estabelecem os parâmetros utilizados pelo script. Antes de começar a sério, garantimos que o Serviço de Suporte Bluetooth esteja em execução e o inicie, se não estiver. Em seguida, carregamos o System.Runtime.WindowsRuntime
assembly para que possamos usar o WindowsRuntimeSystemExtensions.AsTask
método para converter tarefas no estilo WinRT (que o .NET / PowerShell não entende) em .NET Task
s. Esse método específico possui uma carga de conjuntos de parâmetros diferentes que parecem disparar a resolução de sobrecarga do PowerShell; portanto, na próxima linha, obtemos o específico que executa apenas uma tarefa do 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, carregamos dois tipos necessários dos metadados do WinRT. O restante do script é basicamente uma tradução do código C # que você escreveu na resposta do PowerShell; ele usa a Radio
classe WinRT para encontrar e configurar o rádio Bluetooth.