Đây là một thách thức vì sự tương tác cần thiết với WinRT, nhưng có thể trong PowerShell thuần túy:
[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
Để sử dụng, lưu nó là tệp PS1, ví dụ: bluetooth.ps1
. Nếu bạn chưa có, hãy làm theo các hướng dẫn trong phần Kích hoạt tập lệnh của wiki thẻ PowerShell để cho phép thực thi các tập lệnh trên hệ thống của bạn. Sau đó, bạn có thể chạy nó từ một dấu nhắc PowerShell như thế này:
.\bluetooth.ps1 -BluetoothStatus On
Để tắt Bluetooth, hãy vượt qua Off
thay thế.
Để chạy nó từ một tệp bó:
powershell -command .\bluetooth.ps1 -BluetoothStatus On
Hãy cẩn thận: Nếu Dịch vụ hỗ trợ Bluetooth không chạy, tập lệnh sẽ cố khởi động nó vì nếu không, WinRT sẽ không thấy radio Bluetooth. Than ôi, dịch vụ không thể được khởi động nếu tập lệnh không chạy với tư cách quản trị viên. Để làm cho điều đó không cần thiết, bạn có thể thay đổi loại khởi động của dịch vụ đó thành tự động.
Bây giờ cho một số giải thích. Ba dòng đầu tiên thiết lập các tham số mà tập lệnh thực hiện. Trước khi bắt đầu một cách nghiêm túc, chúng tôi đảm bảo Dịch vụ hỗ trợ Bluetooth đang chạy và khởi động nếu không. Chúng tôi sau đó tải System.Runtime.WindowsRuntime
lắp ráp để chúng ta có thể sử dụng WindowsRuntimeSystemExtensions.AsTask
phương thức để chuyển đổi các tác vụ theo kiểu WinRT (mà .NET / PowerShell không hiểu) sang .NET Task
S. Phương thức cụ thể đó có một khối lượng các bộ tham số khác nhau dường như tăng độ phân giải quá tải của PowerShell, vì vậy trong dòng tiếp theo, chúng ta sẽ nhận được một bộ cụ thể chỉ thực hiện một tác vụ WinRT. Sau đó, chúng tôi xác định một hàm sẽ sử dụng nhiều lần để trích xuất kết quả của loại thích hợp từ tác vụ WinRT không đồng bộ. Theo tuyên bố của chức năng đó, chúng tôi tải hai loại cần thiết từ siêu dữ liệu WinRT . Phần còn lại của tập lệnh gần như chỉ là bản dịch PowerShell của mã C # mà bạn đã viết trong câu trả lời của mình; nó sử dụng Radio
Lớp WinRT để tìm và cấu hình radio Bluetooth.