Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to connect and disconnect a Bluetooth device with a PowerShell script on Windows?

I have a very slow and relatively cheap computer. When I turn it on, I turn on my Bluetooth mouse. The mouse works fine for a few seconds, then the connection is broken. If I then reconnect the mouse, it works as it should be until I turn it off again.

My goal is: I would like to write a PowerShell script that will reconnect the mouse automatically, but I don't know how it works with Bluetooth in PowerShell. Could anyone help me with that?

like image 776
AllAwesome497 Avatar asked Dec 06 '18 00:12

AllAwesome497


People also ask

How do I connect to a Bluetooth device through terminal?

Using the bluetoothctl Command To interact with bluetoothd from the terminal, we use the bluetoothctl command. Using bluetoothctl by itself will open the interactive shell. This is called interactive mode and is where we can run commands to configure our Bluetooth settings.


2 Answers

Try something like this, note that elevated permissions are required:

$device = Get-PnpDevice -class Bluetooth -friendlyname "FriendlyDeviceName"
Disable-PnpDevice -InstanceId $device.InstanceId -Confirm:$false
Start-Sleep -Seconds 10
Enable-PnpDevice -InstanceId $device.InstanceId -Confirm:$false

This script disables the device and after 10 seconds enables it again.

like image 77
Bernard Moeskops Avatar answered Sep 24 '22 13:09

Bernard Moeskops


Try this Powershell script, it disables, and unpairs the Bluetooth peripheral (source). Many thanks to xzion14!

$Source = @"
   [DllImport("BluetoothAPIs.dll", SetLastError = true, CallingConvention = CallingConvention.StdCall)]
   [return: MarshalAs(UnmanagedType.U4)]
   static extern UInt32 BluetoothRemoveDevice(IntPtr pAddress);
   public static UInt32 Unpair(UInt64 BTAddress) {
      GCHandle pinnedAddr = GCHandle.Alloc(BTAddress, GCHandleType.Pinned);
      IntPtr pAddress     = pinnedAddr.AddrOfPinnedObject();
      UInt32 result       = BluetoothRemoveDevice(pAddress);
      pinnedAddr.Free();
      return result;
   }
"@
Function Get-BTDevice {
    Get-PnpDevice -class Bluetooth |
      ?{$_.HardwareID -match 'DEV_'} |
         select Status, Class, FriendlyName, HardwareID,
            # Extract device address from HardwareID
            @{N='Address';E={[uInt64]('0x{0}' -f $_.HardwareID[0].Substring(12))}}
}
################## Execution Begins Here ################
$BTDevices = @(Get-BTDevice) # Force array if null or single item
$BTR = Add-Type -MemberDefinition $Source -Name "BTRemover"  -Namespace "BStuff" -PassThru
Do {
   If ($BTDevices.Count) {
      "`n******** Bluetooth Devices ********`n" | Write-Host
      For ($i=0; $i -lt $BTDevices.Count; $i++) {
         ('{0,5} - {1}' -f ($i+1), $BTDevices[$i].FriendlyName) | Write-Host
      }
      $selected = Read-Host "`nSelect a device to remove (0 to Exit)"
      If ([int]$selected -in 1..$BTDevices.Count) {
         'Removing device: {0}' -f $BTDevices[$Selected-1].FriendlyName | Write-Host
         $Result = $BTR::Unpair($BTDevices[$Selected-1].Address)
         If (!$Result) {"Device removed successfully." | Write-Host}
         Else {"Sorry, an error occured." | Write-Host}
      }
   }
   Else {
      "`n********* No devices foundd ********" | Write-Host
   }
} While (($BTDevices = @(Get-BTDevice)) -and [int]$selected)
like image 23
Blacksheeps Avatar answered Sep 21 '22 13:09

Blacksheeps