Ini menantang karena interoperasi yang diperlukan dengan WinRT, tetapi dimungkinkan dalam PowerShell murni:
[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
Untuk menggunakannya, simpan itu file PS1, mis bluetooth.ps1
. Jika Anda belum melakukannya, ikuti instruksi di bagian Skrip yang Mengaktifkan wiki tag PowerShell untuk mengaktifkan eksekusi skrip di sistem Anda. Kemudian Anda dapat menjalankannya dari prompt PowerShell seperti ini:
.\bluetooth.ps1 -BluetoothStatus On
Untuk mematikan Bluetooth, lewati Off
saja.
Untuk menjalankannya dari file batch:
powershell -command .\bluetooth.ps1 -BluetoothStatus On
Peringatan: Jika Layanan Dukungan Bluetooth tidak berjalan, skrip mencoba untuk memulainya karena jika tidak, WinRT tidak akan melihat radio Bluetooth. Sayangnya, layanan tidak dapat dimulai jika skrip tidak berjalan sebagai administrator. Untuk membuatnya tidak perlu, Anda dapat mengubah jenis startup layanan itu menjadi otomatis.
Sekarang untuk penjelasan. Tiga baris pertama menetapkan parameter yang diambil skrip. Sebelum memulai dengan sungguh-sungguh, kami memastikan Layanan Dukungan Bluetooth berjalan dan memulainya jika tidak. Kami kemudian memuat System.Runtime.WindowsRuntime
perakitan sehingga kami dapat menggunakan WindowsRuntimeSystemExtensions.AsTask
metode untuk mengkonversi tugas-tugas gaya WinRT (yang .NET / PowerShell tidak mengerti) ke .NET Task
s. Metode khusus itu memiliki muatan set parameter yang berbeda yang tampaknya meningkatkan resolusi kelebihan PowerShell, jadi pada baris berikutnya kita mendapatkan yang spesifik yang hanya mengambil tugas WinRT yang dihasilkan. Kemudian kita mendefinisikan fungsi yang akan kita gunakan beberapa kali untuk mengekstrak hasil dari tipe yang sesuai dari tugas WinRT yang tidak sinkron. Setelah deklarasi fungsi itu, kami memuat dua jenis yang diperlukan dari metadata WinRT. Sisa skrip cukup banyak hanya terjemahan PowerShell dari kode C # yang Anda tulis dalam jawaban Anda; menggunakan Radio
kelas WinRT untuk menemukan dan mengkonfigurasi radio Bluetooth.