Bật / tắt radio / bộ chuyển đổi Bluetooth từ cmd / powershell trong Windows 10


23

Một nhiệm vụ đơn giản như vậy, người ta sẽ nói, và tôi chưa tìm thấy một giải pháp thỏa đáng. Những gì tôi đã thử (với âm nhạc phát qua loa được kết nối Bluetooth để thực sự biết trạng thái của radio):

  • sử dụng devcon làm quản trị viên: devcon disable USB\VID_8087&PID_07DC&REV_0001 (đó là ID ID của bộ điều hợp Bluetooth của tôi) ... yêu cầu khởi động lại để hoạt động ...
  • sử dụng powershell làm quản trị viên: Disable-NetAdapter "Bluetooth Network Connection 3" (đó là bản dịch tên bộ điều hợp Bluetooth của tôi) ... nó vô hiệu hóa trình điều khiển PAN, nhưng loa Bluetooth tiếp tục phát nhạc ...
  • sử dụng mạng làm quản trị viên: net stop bthserv... không thực sự tắt radio (loa BT tiếp tục phát nhạc)
  • sử dụng .NET: Trang có liên quan nhất trên MSDN không nói một từ nào về việc bật / tắt bộ chuyển đổi.
  • sử dụng thám hiểm: ms-settings:bluetooth hoặc là explorer.exe %LocalAppData%\Packages\windows.immersivecontrolpanel_cw5n1h2txyewy\LocalState\Indexed\Settings\cs-CZ\AAA_SettingsPagePCSystemBluetooth.settingcontent-ms... mở bảng cài đặt Bluetooth, nhưng tôi vẫn phải nhấp vào nút chuyển đổi

Tôi không thể tin rằng Microsoft sẽ không biết gì khi không cung cấp một lệnh như vậy ...


Bạn đang chơi nhạc như thế nào?
harrymc

Sử dụng Winamp :)
Martin Pecka

Việc giết Winamp có ngăn chặn âm nhạc không?
harrymc

Tất nhiên, tại sao nó lại không? Nhưng câu hỏi không phải là dừng phát nhạc, mà là kiểm soát đài BT.
Martin Pecka

Bạn không thể dừng âm nhạc bằng cách vô hiệu hóa thiết bị. Bạn không muốn dừng chương trình. Vì vậy, tất cả những gì bạn còn lại là tắt tiếng thiết bị. Đó sẽ là một giải pháp?
harrymc

Câu trả lời:


12

Đâ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.


Bạn không thể gọi một phương thức trên biểu thức có giá trị null. Tại C: \ Users \ chx \ AppData \ Local \ Microsoft \ WindowsApps \ bluetooth.ps1: 18 char: 1 + Await ($ bluetooth.SetStateAsync ($ BluetoothStatus)) ([Windows.Devices.
chx

@chx Bạn có chắc máy của bạn có bộ chuyển đổi Bluetooth? Nếu không có radio Bluetooth, dòng thứ ba đến cuối cùng sẽ được đặt $bluetooth thành null, điều này sẽ khiến dòng thứ hai đến cuối cùng tạo ra lỗi đó.
Ben N

Tôi chắc chắn 100% nó hiển thị trong ứng dụng "Cài đặt" và tôi nghe nhạc không dây và cả Trình quản lý thiết bị và wmic cũng báo cáo.
chx

@chx Hmm, bạn sẽ nhận được gì nếu thay thế ba dòng cuối cùng chỉ bằng $radios? Điều đó sẽ hiển thị danh sách các bộ đàm mà WinRT đã trả lại.
Ben N

2
Thông minh, nó hoạt động! Tôi không thể biên dịch một ứng dụng máy tính để bàn bằng API này, nhưng tải nó một cách linh hoạt trong một tập lệnh dường như là cách để đi. Bây giờ, so sánh với rfkill unblock bluetooth trên Linux :-D
Martin Pecka

3

Sau khi từ bỏ để tìm kiếm các giải pháp làm sẵn, tôi đã phát hiện ra rằng các ứng dụng Universal Windows Platform có quyền truy cập vào API điều khiển vô tuyến .

Vì vậy, tôi đã hợp nhất một ứng dụng điều khiển vô tuyến mẫu với một ứng dụng được điều khiển bằng dòng lệnh và kết quả là đây: https://github.com/peci1/RadioControl . nó là xuất bản trên Windows Store .

Nói chung, không thể chỉ để ứng dụng chạy ở chế độ nền, vì vậy trước tiên bạn cần khởi chạy GUI và sau đó bạn có thể gọi nó từ dòng lệnh như

radiocontrol.exe 0 on
radiocontrol.exe Bluetooth off

Các tính năng cốt lõi mà ứng dụng này cần là:

using Windows.Devices.Radios;
await Radio.RequestAccessAsync();
var radios = await Radio.GetRadiosAsync();
await radios[0].SetStateAsync(RadioState.On);

Sau đó, bạn cũng cần thêm khả năng Radios vào bảng kê khai ứng dụng:

<DeviceCapability Name="radios" />

Và để cho phép kiểm soát từ dòng lệnh, bạn cần ghi đè phương thức protected override async void OnActivated(IActivatedEventArgs args) trong App.xaml.cs và thực hiện xử lý trong một nhánh như thế này:

switch (args.Kind)
        {
            case ActivationKind.CommandLineLaunch:

Câu trả lời này phù hợp hơn với StackOverflow.
harrymc

2

Kịch bản Autohotkey này dường như thực hiện các mẹo. Tôi bị làm phiền bởi Sleep nhưng có vẻ như cửa sổ sẽ hoạt động trước khi nó sẵn sàng nhận tổ hợp phím của tôi.

SendMode Input
Run, ms-settings:bluetooth
WinWaitActive, Settings
Sleep 300
Send,{Tab}{Space}
WinClose, A

Vượt qua https://stackoverflow.com/q/48700268/308851 để tìm ra cái đó Sleep 300 có thể được thay thế bằng.


Đây cũng có thể là một giải pháp trong hầu hết các trường hợp. Tôi cũng cần thêm một giấc ngủ ngắn sau khi gửi tổ hợp phím. Và giải pháp này không hoạt động nếu màn hình bị khóa. Ứng dụng Universal Windows mà tôi đã đăng ở trên không hoạt động ngay cả với màn hình bị khóa.
Martin Pecka

1

Đây là một giải pháp một phần: wmic path Win32_PNPEntity where "caption like '%bluetooth%' AND DeviceID like 'USB\\%'" call disable chắc chắn làm cho công tắc bật / tắt Bluetooth biến mất và báo cáo Trình quản lý thiết bị This device is disabled. (Code 22). Cho dù đó là đủ để giết đài phát thanh, tôi không chắc chắn.

Tôi không thể tìm tài liệu về những gì đối số call chấp nhận Tôi nghĩ nên có một số loại rfkill đây.


Tôi xin lỗi, không làm việc cho tôi như bạn mô tả nó. Đối với tôi, phát lại Bluetooth dừng, nhưng tất cả các công tắc bluetooth trong bảng điều khiển vẫn bật. Và gọi với enable không tiếp tục phát lại Bluetooth. Tài liệu về lớp PNPEntity có tại đây: msdn.microsoft.com/en-us/l Library / aa394353 (v = vs85) .aspx , nhưng dường như không có phương pháp hữu ích nào khác ở đó ...
Martin Pecka

0

Powershell có các lệnh ghép ngắn để thực hiện chính xác những gì bạn đang tìm kiếm:

https://gallery.technet.microsoft.com/PowerShell-Device-60d73bb0

Sử dụng Get-Device để nhận danh sách các thiết bị. Bạn có thể chuyển hướng đó qua đối tượng để chọn thiết bị của mình và sau đó chuyển đường dẫn đó sang Vô hiệu hóa thiết bị hoặc Bật thiết bị.

Hướng dẫn chi tiết...

Tải về và giải nén tập tin.

Bắt đầu một quyền hạn như quản trị viên.

Thay đổi chính sách thực hiện nếu cần thiết:

Set-ExecutionPolicy Unrestricted

Nhập mô-đun:

Import-Module .\DeviceManagement.psd1

Nếu bạn cần thu hẹp danh sách các thiết bị, bạn có thể sử dụng so sánh giống như:

Get-Device | Where-Object {$_.Name -like '*bluetooth*'}

Nếu bạn biết tên chính xác, bạn có thể sử dụng so sánh -eq (bằng):

Get-Device | Where-Object {$_.Name -eq 'Martin's Bluetooth Adapter'} | Disable-Device -Confirm:$False

Lau tay trên quần.


Điều này sẽ vô hiệu hóa thiết bị USB thay vì chỉ radio. wmic cũng có thể làm điều này, ít nhất là tôi nghĩ vậy.
chx

Câu hỏi không hỏi làm thế nào để vô hiệu hóa radio nhưng không phải là bộ chuyển đổi. Tại sao lại phân biệt? Nếu bạn có thể cho tôi một lý do chính đáng, tôi sẽ xem xét việc đào cho bạn, nhưng tôi đã trả lời câu hỏi được hỏi "Điều tôi thực sự quan tâm là cách vô hiệu hóa / kích hoạt bộ điều hợp Bluetooth. - Martin Pecka ngày 5 tháng 2 tại 9:31 "
apocalysque

Tôi xin lỗi, sự khác biệt giữa bộ chuyển đổi và đài phát thanh là gì? Tôi xem xét hai điều khoản tương đương. Có rất nhiều thiết bị phần mềm mà điều này cung cấp, và bạn nói đúng câu hỏi này không phải là về chúng.
Martin Pecka

Hơn nữa, cả kịch bản PS và 2012 này của Ricardo Mendes đều không hoạt động tại Win 10 1709 64bit của tôi, như được đề cập trong các nhận xét của họ. Cả hai đều có lỗi Disable-Device : Error calling SetupDiCallClassInstaller. Tôi chạy chúng với tư cách quản trị viên và với chính sách thực thi không hạn chế.
Martin Pecka

0

Bạn có thể dùng DevmanView để bật / tắt thiết bị từ dòng lệnh bằng cú pháp này:

devmanview /disable <Device Name>   
devmanview /enable <Device Name>    

Nó cũng cho phép sử dụng các ký tự đại diện với /use_wildcard tranh luận.


Devmanview thực sự là một công cụ hữu ích, nhưng nó không giải quyết được vấn đề của tôi. Vấn đề là dường như không có thiết bị nào bạn có thể vô hiệu hóa trong trình quản lý thiết bị để tắt radio bluetooth.
Martin Pecka

@MartinPecka Bạn không thấy cái nào trong số này? i.stack.imgur.com/UrOuc.png Nếu không, bạn có thể muốn thử và cập nhật trình điều khiển ...
rahuldottech

Tôi thấy thiết bị Bluetooth, nhưng vô hiệu hóa thiết bị không dừng phát lại - có lẽ vì hệ thống cần được khởi động lại để thiết bị thực sự bị vô hiệu hóa (như đã nêu trong câu hỏi ban đầu).
Martin Pecka

0

Tôi đã tạo một tập lệnh bó để kiểm tra giá trị khóa reg sẽ chỉ được đặt nếu radio bluetooth của bạn được bật. Sau đó, nó gọi tập lệnh powershell của Ben N ở trên với tham số chính xác để chuyển trạng thái hiện tại. Biến nó thành một phím tắt chuyển đổi, thay vì phải sử dụng bật và tắt riêng biệt.

@echo off
FOR /F "skip=2 tokens=2,*" %%A IN ('reg.exe query "HKLM\SYSTEM\CurrentControlSet\Services\bthserv\Parameters\BluetoothControlPanelTasks" /v "state"') DO set "VAR=%%B"

if %VAR%==0x1 (goto ON)

Powershell.exe -executionpolicy remotesigned -windowstyle hidden -File ".\bluetooth.ps1" -BluetoothStatus On
goto end

:ON
Powershell.exe -executionpolicy remotesigned -windowstyle hidden -File ".\bluetooth.ps1" -BluetoothStatus Off

:end

-1

Thực hiện lệnh sau từ Command Prompt (với tư cách quản trị viên) đã thực hiện thủ thuật:

netsh interface set interface name="Bluetooth Network Connection" admin=disabled

Trước đây tôi đã sử dụng cùng một lệnh để tắt bộ điều hợp Wi-Fi của mình và thấy rằng nó cũng hoạt động với các bộ điều hợp khác trong: Bảng điều khiển & gt; Mạng và Internet & gt; Kết nối mạng. Chỉ cần thay đổi đối số "tên" thành tên của bộ điều hợp của bạn. Bạn cũng có thể kích hoạt lại bằng cách thay đổi đối số cuối cùng thành admin=enabled.


1
Điều này dường như cũng chỉ vô hiệu hóa trình điều khiển PAN, nhưng không tự tắt thiết bị radio (trong bảng điều khiển, Bluetooth vẫn được báo cáo là "bật").
Martin Pecka

Xác minh ngay bằng thử nghiệm repro bluetooth, không tắt bluetooth.
Martin Pecka

Tôi xin lỗi @ peci1, tôi đã hiểu nhầm câu hỏi của bạn. Trước đây tôi đã xem xét các câu hỏi liên quan đến vô hiệu hóa Bluetooth và giải thích câu hỏi của bạn là như nhau. Vì vậy, mục tiêu của bạn là tắt (cắt điện cho) thiết bị Bluetooth? Tôi sẽ nghiên cứu một chút và cho bạn biết nếu tôi tìm thấy bất cứ điều gì.
Micah Vertal

@ peci1 sẽ liên kết này có ích gì không?
Micah Vertal

Không nó không. Đó là về USB, không phải thiết bị Bluetooth. Và Cmdlet Quản lý thiết bị được liên kết cũng không hoạt động.
Martin Pecka

-1

Tôi nghĩ rằng tôi có thể có câu trả lời cho bạn, nhưng thiết bị Corporate Win10 của tôi đã bị khóa. Đây phải là thay đổi giá trị khóa sổ đăng ký, do đó chạy CMD với tư cách Quản trị viên và truy vấn khóa, sau đó sử dụng REG DELETE và ADD để thay đổi giá trị sẽ vô hiệu hóa và kích hoạt dịch vụ.

Hoặc bạn có thể viết một tệp .reg văn bản đơn giản để ghi đè lên các giá trị chính, nhưng sẽ cần quyền quản trị để thực thi.

Dù sao, tôi tin rằng bạn có các kỹ năng để làm việc đó một khi được tìm thấy.

Chúc may mắn,

Jay


2
Jay, xin vui lòng, không trả lời nếu bạn không có thông tin mà OP đang yêu cầu. Nếu bạn biết khóa đăng ký, hãy đặt nó vào câu trả lời của bạn. Và liên kết đến một số tài liệu hoặc việc sử dụng khóa sẽ chứng minh rằng nó thực sự hoạt động như bạn mô tả (hoặc tự chứng minh bằng cách thử nó trên một máy đã mở khóa).
Martin Pecka
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.