Dies ist aufgrund der erforderlichen Interoperation mit WinRT eine Herausforderung, aber in reiner PowerShell ist Folgendes möglich:
[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
Um es zu verwenden, speichern Sie es als PS1-Datei, z bluetooth.ps1
. Wenn Sie dies noch nicht getan haben, befolgen Sie die Anweisungen im Abschnitt "Aktivieren von Skripten" des PowerShell-Tag-Wikis , um die Ausführung von Skripten auf Ihrem System zu aktivieren. Dann können Sie es an einer PowerShell-Eingabeaufforderung wie folgt ausführen:
.\bluetooth.ps1 -BluetoothStatus On
Um Bluetooth auszuschalten, übergeben Sie Off
stattdessen.
So führen Sie es aus einer Batchdatei aus:
powershell -command .\bluetooth.ps1 -BluetoothStatus On
Vorsichtsmaßnahme: Wenn der Bluetooth-Supportdienst nicht ausgeführt wird, versucht das Skript, ihn zu starten, da WinRT andernfalls keine Bluetooth-Funkgeräte erkennt. Leider kann der Dienst nicht gestartet werden, wenn das Skript nicht als Administrator ausgeführt wird. Um dies unnötig zu machen, können Sie den Starttyp dieses Dienstes in "Automatisch" ändern.
Nun zur Erklärung. Die ersten drei Zeilen legen die Parameter fest, die das Skript verwendet. Bevor wir ernsthaft beginnen, stellen wir sicher, dass der Bluetooth-Support-Dienst ausgeführt wird, und starten ihn, falls nicht. Anschließend laden System.Runtime.WindowsRuntime
wir die Assembly, damit wir mit der WindowsRuntimeSystemExtensions.AsTask
Methode Aufgaben im WinRT-Stil (die .NET / PowerShell nicht versteht) in .NET konvertieren können Task
. Diese bestimmte Methode verfügt über eine Schiffsladung verschiedener Parametersätze, die die Überlastungsauflösung von PowerShell auszulösen scheinen. In der nächsten Zeile erhalten wir die spezifische Methode, die nur eine erfolgreiche WinRT-Aufgabe übernimmt. Anschließend definieren wir eine Funktion, die wir mehrmals verwenden, um ein Ergebnis des entsprechenden Typs aus einer asynchronen WinRT-Task zu extrahieren. Nach der Deklaration dieser Funktion laden wir zwei notwendige Typen aus WinRT-Metadaten. Der Rest des Skripts ist so ziemlich nur eine PowerShell-Übersetzung des C # -Codes, den Sie in Ihrer Antwort geschrieben haben. Es verwendet die Radio
WinRT-Klasse zum Suchen und Konfigurieren des Bluetooth-Funkgeräts.