C'est difficile en raison de l'interopérabilité nécessaire avec WinRT, mais cela est possible dans PowerShell pur:
[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 est un fichier PS1, par exemple bluetooth.ps1
. Si vous ne l'avez pas déjà fait, suivez les instructions de la section Activation des scripts du wiki de balises PowerShell pour activer l'exécution des scripts sur votre système. Ensuite, vous pouvez l'exécuter à partir d'une invite PowerShell comme celle-ci:
.\bluetooth.ps1 -BluetoothStatus On
Pour désactiver Bluetooth, passez à la Off
place.
Pour l'exécuter à partir d'un fichier batch:
powershell -command .\bluetooth.ps1 -BluetoothStatus On
Avertissement: si le service d'assistance 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, pour une explication. Les trois premières lignes établissent les paramètres du script. Avant de commencer sérieusement, nous nous assurons que le service d'assistance Bluetooth est en cours d'exécution et le démarrons sinon. Nous chargeons ensuite l' System.Runtime.WindowsRuntime
assembly afin de pouvoir utiliser la WindowsRuntimeSystemExtensions.AsTask
méthode pour convertir des tâches de style WinRT (que .NET / PowerShell ne comprend pas) en .NET Task
s. Cette méthode particulière a une cargaison de différents jeux de paramètres qui semblent déclencher la résolution de surcharge de PowerShell, donc dans la ligne suivante, nous obtenons celle spécifique qui ne prend qu'une tâche WinRT résultante. 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 à partir des métadonnées WinRT. Le reste du script est à peu près juste une traduction PowerShell du code C # que vous avez écrit dans votre réponse; il utilise la Radio
classe WinRT pour rechercher et configurer la radio Bluetooth.