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.