C’est un défi en raison de l’interopération nécessaire avec WinRT, mais c’est possible en pur 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
Pour l’utiliser, enregistrez-le comme fichier PS1, par exemple bluetooth.ps1. Si ce n’est pas déjà fait, suivez les instructions de la section Activation des scripts du wiki du tag powershell pour activer l’exécution de scripts sur votre système. Ensuite vous pouvez l’exécuter depuis une invite PowerShell comme ceci :
.\bluetooth.ps1 -BluetoothStatus On
Pour désactiver le Bluetooth, passez Off à la place.
Pour l’exécuter depuis un fichier batch :
powershell -command .\bluetooth.ps1 -BluetoothStatus On
Mise en garde : Si le Service de support Bluetooth n’est pas en cours d’exécution, le script tente de le démarrer car sinon, WinRT ne verra pas les radios Bluetooth. Hélas, le service ne peut pas être démarré si le script ne s’exécute pas en tant qu’administrateur. Pour rendre cela inutile, vous pouvez changer le type de démarrage de ce service en automatique.
Maintenant quelques explications. Les trois premières lignes établissent les paramètres que le script accepte. Avant de commencer sérieusement, nous nous assurons que le Service de support Bluetooth est en cours d’exécution et le démarrons sinon. Nous chargeons ensuite l’assembly System.Runtime.WindowsRuntime pour pouvoir utiliser la méthode WindowsRuntimeSystemExtensions.AsTask pour convertir les tâches de style WinRT (que .NET/PowerShell ne comprend pas) en Task .NET. Cette méthode particulière a une quantité énorme de jeux de paramètres différents qui semblent perturber la résolution de surcharge de PowerShell, donc dans la ligne suivante nous obtenons celui spécifique qui ne prend qu’une tâche WinRT avec résultat. Ensuite nous définissons une fonction que nous utiliserons plusieurs fois pour extraire un résultat du type approprié d’une tâche WinRT asynchrone. Après la déclaration de cette fonction, nous chargeons deux types nécessaires depuis les métadonnées WinRT. Le reste du script est essentiellement une traduction PowerShell du code C# que vous avez écrit dans votre réponse ; il utilise la classe WinRT Radio pour trouver et configurer la radio Bluetooth.