Skip to content

Instantly share code, notes, and snippets.

@u01jmg3
Created May 17, 2020 09:52
Show Gist options
  • Select an option

  • Save u01jmg3/0305dee156158f5c987056c4ff0df94e to your computer and use it in GitHub Desktop.

Select an option

Save u01jmg3/0305dee156158f5c987056c4ff0df94e to your computer and use it in GitHub Desktop.
Windows Powershell Script to Toggle Bluetooth On or Off
[CmdletBinding()] Param (
[Parameter()][ValidateSet('On', 'Off')][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
if (!$BluetoothStatus) { if ($bluetooth.state -eq 'On') { $BluetoothStatus = 'Off' } else { $BluetoothStatus = 'On' } }
Await ($bluetooth.SetStateAsync($BluetoothStatus)) ([Windows.Devices.Radios.RadioAccessStatus]) | Out-Null
@DamagedDingo

Copy link
Copy Markdown

Works perfectly.
Thanks!

@FyeCobain

Copy link
Copy Markdown

Great. Thanks! 👍

@you2mura

you2mura commented Aug 7, 2024

Copy link
Copy Markdown

Very helpful. wonderful.

@pgriesser

Copy link
Copy Markdown

Thanks for your work! I wrote a small PS module based on your script that can be used with the new pwsh, since that has problems running the WinRT calls.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment