Це складно через необхідну взаємодію з WinRT, але це можливо в чистому 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
Для його використання збережіть файл PS1, наприклад bluetooth.ps1
. Якщо ви ще цього не зробили, дотримуйтесь інструкцій у розділі Включення сценаріїв у вікі тегів PowerShell, щоб увімкнути виконання сценаріїв у вашій системі. Тоді ви можете запустити його з підказки PowerShell так:
.\bluetooth.ps1 -BluetoothStatus On
Щоб вимкнути Bluetooth, перейдіть Off
натомість.
Щоб запустити його з пакетного файлу:
powershell -command .\bluetooth.ps1 -BluetoothStatus On
Caveat: Якщо Служба підтримки Bluetooth не працює, сценарій намагається запустити її, оскільки в іншому випадку WinRT не побачить радіо Bluetooth. На жаль, службу неможливо запустити, якщо сценарій не працює як адміністратор. Щоб зробити це непотрібним, ви можете змінити тип запуску цієї служби на автоматичний.
Тепер для деяких пояснень. Перші три рядки встановлюють параметри, які приймає сценарій. Перш ніж серйозно розпочати, ми переконуємося, що служба підтримки Bluetooth працює, і запустити її, якщо ні. Потім завантажуємо System.Runtime.WindowsRuntime
збірку, щоб ми могли використовувати WindowsRuntimeSystemExtensions.AsTask
метод перетворення завдань у стилі WinRT (яких .NET / PowerShell не розуміє) у .NET Task
s. У цьому конкретному методі є завантаження різних наборів параметрів, які, схоже, відключають роздільну здатність перевантаження PowerShell, тому в наступному рядку ми отримуємо конкретний, який приймає лише результативне завдання WinRT. Потім ми визначаємо функцію, яку ми будемо використовувати кілька разів для отримання результату відповідного типу з асинхронної задачі WinRT. Після оголошення цієї функції ми завантажуємо два необхідні типи з метаданих WinRT. Залишок сценарію - це лише переклад PowerShell коду C #, який ви написали у своїй відповіді; він використовує Radio
клас WinRT для пошуку та налаштування радіо Bluetooth.