Questo è impegnativo a causa dell'interazione necessaria con WinRT, ma è possibile in 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
Per usarlo, salvarlo è un file PS1, ad es bluetooth.ps1
. Se non lo hai già fatto, segui le istruzioni nella sezione Abilitazione degli script del wiki del tag PowerShell per abilitare l'esecuzione degli script sul tuo sistema. Quindi è possibile eseguirlo da un prompt di PowerShell in questo modo:
.\bluetooth.ps1 -BluetoothStatus On
Per disattivare il Bluetooth, passa Off
invece.
Per eseguirlo da un file batch:
powershell -command .\bluetooth.ps1 -BluetoothStatus On
Avvertenza: se il servizio di supporto Bluetooth non è in esecuzione, lo script tenta di avviarlo perché altrimenti WinRT non vedrà le radio Bluetooth. Purtroppo, il servizio non può essere avviato se lo script non è in esecuzione come amministratore. Per rendere ciò non necessario, è possibile modificare il tipo di avvio di quel servizio su automatico.
Ora per qualche spiegazione. Le prime tre righe stabiliscono i parametri dello script. Prima di iniziare sul serio, ci assicuriamo che il servizio di supporto Bluetooth sia in esecuzione e avviarlo in caso contrario. Carichiamo quindi l' System.Runtime.WindowsRuntime
assembly in modo da poter utilizzare il WindowsRuntimeSystemExtensions.AsTask
metodo per convertire le attività in stile WinRT (che .NET / PowerShell non capisce) in .NET Task
. Questo particolare metodo ha un carico di diversi set di parametri che sembrano inciampare nella risoluzione di sovraccarico di PowerShell, quindi nella riga successiva abbiamo quello specifico che prende solo un'attività WinRT risultante. Quindi definiamo una funzione che useremo più volte per estrarre un risultato del tipo appropriato da un'attività WinRT asincrona. A seguito della dichiarazione di tale funzione, vengono caricati due tipi necessari dai metadati WinRT. Il resto dello script è praticamente solo una traduzione PowerShell del codice C # che hai scritto nella tua risposta; utilizza la Radio
classe WinRT per trovare e configurare la radio Bluetooth.