PowerShell脚本开发求助:如何列出已配对蓝牙设备实现自动锁屏
解决PowerShell蓝牙设备检测与系统锁定脚本问题
嘿,我来帮你搞定这个每隔15秒检查蓝牙设备连接状态并锁定系统的脚本!你之前的代码没法列出已配对设备,核心问题是把获取设备的逻辑写成了字符串,没有实际执行命令,而且也没用到正确的PowerShell命令来抓取蓝牙设备信息。
核心解决思路
要获取已配对的蓝牙设备,我们可以用Get-PnpDevice命令筛选蓝牙类设备,再结合设备状态和ID特征来定位已配对的设备;然后通过检查设备的DeviceState属性判断是否处于连接状态;最后如果检测到所有已配对设备都断开(或者指定设备断开),就执行系统锁定命令。
完整可运行脚本
# 循环执行检测逻辑 do { # 等待15秒(把等待放在循环开头,避免刚启动就立刻检测) Start-Sleep -Seconds 15 # 获取所有已配对的蓝牙设备 # 筛选条件:蓝牙类设备 + 状态正常(已配对) + 设备ID包含蓝牙枚举标识 $pairedBluetoothDevices = Get-PnpDevice -Class Bluetooth | Where-Object { $_.Status -eq 'OK' -and $_.DeviceID -match 'BTHENUM' } # 标记是否所有设备都断开连接 $allDevicesDisconnected = $true # 遍历每个已配对设备,检查连接状态 foreach ($device in $pairedBluetoothDevices) { # 获取设备的详细属性,包括DeviceState $deviceProps = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Enum\$($device.DeviceID)" -ErrorAction SilentlyContinue # DeviceState中,0x00000002表示设备已连接(不同系统可能略有差异,可自行测试调整) if ($deviceProps.DeviceState -band 0x00000002) { Write-Host "$($device.FriendlyName) 处于连接状态" $allDevicesDisconnected = $false } else { Write-Host "$($device.FriendlyName) 已断开/超出范围" } } # 如果所有已配对蓝牙设备都断开,锁定系统 if ($allDevicesDisconnected -and $pairedBluetoothDevices.Count -gt 0) { Write-Host "所有已配对蓝牙设备均已断开,正在锁定系统..." rundll32.exe user32.dll,LockWorkStation } } while ($true) # 无限循环执行
关键细节说明
- 获取已配对设备:用
Get-PnpDevice -Class Bluetooth抓取所有蓝牙设备,再通过DeviceID -match 'BTHENUM'筛选出已配对的(因为蓝牙枚举设备ID包含BTHENUM标识),Status -eq 'OK'确保设备是已配对且正常识别的。 - 连接状态判断:通过读取注册表中设备的
DeviceState属性,用位运算-band 0x00000002判断是否处于连接状态(这个值是Windows蓝牙设备连接状态的标准位标识,大部分系统适用)。 - 系统锁定:用
rundll32.exe user32.dll,LockWorkStation命令实现系统锁定,这是Windows原生的锁定方式,无需额外权限。 - 循环逻辑:把
Start-Sleep放在循环开头,避免脚本启动后立刻执行检测,符合“每隔15秒检查”的需求。
注意事项
- 运行脚本需要管理员权限,因为要读取注册表中的设备信息。
- 如果你只需要检测特定蓝牙设备(比如你的耳机),可以在筛选设备时加上
$_.FriendlyName -eq '你的设备名称'来缩小范围。 - 不同Windows版本的
DeviceState位标识可能略有不同,如果发现判断不准确,可以自行查询对应设备的DeviceState值来调整位掩码。
内容的提问来源于stack exchange,提问作者Indrajit




