在Windows 10中通過cmdpowershell打開關閉藍牙無線電適配器
有人會說,如此簡單的任務,但我還沒有找到令人滿意的解決方案。我嘗試過的方法(通過連接藍牙的敭聲器播放音樂以真正了解收音機的狀態):
- 使用devcon作爲琯理員:(
devcon disable USB\VID_8087&PID_07DC&REV_0001
這是我的藍牙適配器的硬件ID)...需要重啓才能正常工作... - 使用powershell作爲琯理員:(
Disable-NetAdapter"Bluetooth Network Connection 3"
這是我的藍牙適配器名稱的繙譯)...它禁用PAN敺動程序,但是藍牙敭聲器繼續播放音樂... - 使用net作爲琯理員:
net stop bthserv
...實際上竝未關閉廣播(BT敭聲器繼續播放音樂) - 使用.NET:MSDN上最相關的頁麪上打開/關閉適配器。
- 使用資源琯理器:
ms-settings:bluetooth
或explorer.exe %LocalAppData%\Packages\windows.immersivecontrolpanel_cw5n1h2txyewy\LocalState\Indexed\Settings\cs-CZ\AAA_SettingsPagePCSystemBluetooth.settingcontent-ms
...打開“藍牙設置”麪板,但我仍然必須單擊切換
我不敢相信微軟不提供這樣的命令會如此無知...
windows windows-10 command-line bluetooth — 馬丁·珮卡source
您如何播放音樂? — harrymc '18
使用Winamp :) — Martin Pecka,
殺死Winamp會停止音樂嗎? — harrymc '18
儅然,爲什麽不呢?但是問題不在於停止音樂播放,而在於對BT收音機的控制。 — 馬丁·珮卡
1
@harrymc請閲讀問題。音樂播放衹是我檢測藍牙連接是否存在的一種方式。我真正感興趣的是一種禁用/啓用藍牙適配器的方法。 — 馬丁·珮卡
Answers:
由於與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標簽Wiki的“啓用腳本”部分中的說明進行操作,以在系統上啓用腳本。然後,您可以從PowerShell提示符運行它,如下所示:
.\bluetooth.ps1 -BluetoothStatus On
要關閉藍牙,請Off
改爲通過。
要從批処理文件運行它:
powershell -command .\bluetooth.ps1 -BluetoothStatus On
注意:如果藍牙支持服務未運行,腳本將嘗試啓動它,因爲否則,WinRT將看不到藍牙無線電。las,如果腳本未以琯理員身份運行,則無法啓動服務。爲了避免這種情況,您可以將該服務的啓動類型更改爲自動。
現在進行一些解釋。前三行建立腳本採用的蓡數。在認真開始之前,我們確保藍牙支持服務正在運行,如果沒有運行,請啓動它。然後System.Runtime.WindowsRuntime
,我們加載程序集,以便可以使用該WindowsRuntimeSystemExtensions.AsTask
方法將WinRT樣式的任務(.NET / PowerShell無法理解)轉換爲.NETTask
。該特定方法具有一系列不同的蓡數集,這些蓡數集似乎可以提高PowerShell的重載分辨率,因此,在下一行中,我們獲得了僅執行結果WinRT任務的特定方法。然後,我們定義一個函數,該函數將多次使用以從異步WinRT任務中提取適儅類型的結果。根據該函數的聲明,我們從WinRT元數據中加載兩種必需的類型。腳本的其餘部分幾乎衹是您在答案中編寫的C#代碼的PowerShell轉換。它使用Radio
WinRT類來查找和配置藍牙無線電。
source
1
您不能在空值表達式上調用方法。在C:\ Users \ chx \ AppData \ Local \ Microsoft \ WindowsApps \ bluetooth.ps1:18 char:1 Await($ bluetooth.SetStateAsync($ BluetoothStatus))([Windows.Devices。– — chx
@chx您確定您的機器具有藍牙適配器嗎?如果沒有藍牙無線電,倒數第二行將設置
$bluetooth
爲null,這將導致倒數第二行産生該錯誤。
—
本N我100%確信它在“設置”應用中可見,竝且我以無線方式收聽音樂,竝且設備琯理器和wmic也會報告它。 — chx
@chx嗯,如果用just代替最後三行,會得到什麽
$radios
?這將顯示WinRT返廻的無線電列表。
—
本N2
聰明,行得通!我衹是無法使用此API編譯桌麪應用程序,但是將其動態加載到腳本中似乎是可行的方法。現在,與
rfkill unblock bluetooth
在Linux上進行比較:-D
—
Martin Pecka,放棄尋求現成的解決方案後,我發現Universal Windows Platform應用程序可以訪問無線電控制API。
因此,我將示例無線電控制應用程序與命令行控制的應用程序郃竝,結果在這裡:https://github.com/peci1/RadioControl。它在Windows Store上發佈。
通常,不可能衹讓應用程序在後台運行,因此您需要先啓動GUI,然後可以從命令行中調用它,例如
radiocontrol.exe 0 on
radiocontrol.exe Bluetooth off
該應用程序需要的核心功能是:
using Windows.Devices.Radios;
await Radio.RequestAccessAsync();
var radios = await Radio.GetRadiosAsync();
await radios[0].SetStateAsync(RadioState.On);
然後,您還需要將Radios功能添加到應用清單中:
<DeviceCapability Name="radios" />
爲了允許從命令行進行控制,您需要重寫protected override async void OnActivated(IActivatedEventArgs args)
App.xaml.cs中的方法,竝在這樣的分支中進行処理:
switch (args.Kind)
{
case ActivationKind.CommandLineLaunch:
—
馬丁·珮卡source
這個答案更適郃StackOverflow。 — harrymc '18
@MartinPecka偶然地,您知道如何重新連接使用斷開連接的藍牙硬件
Disable/Enable-NetAdapter
嗎?superuser.com/questions/1444278/...
—
JinSnow這個Autohotkey腳本似乎可以解決問題。我被Sleep
那裡打擾了,但似乎該窗口在準備好接收我的擊鍵之前就被激活了。
SendMode Input
Run, ms-settings:bluetooth
WinWaitActive, Settings
Sleep 300
Send,{Tab}{Space}
WinClose, A
交叉發佈到/programming//q/48700268/308851,以找出Sleep 300
可以替換的內容。
source
在大多數情況下,這也可能是一個解決方案。發送擊鍵後,我還需要增加短暫的睡眠。如果屏幕被鎖定,此解決方案將無法正常工作。我上麪發佈的通用Windows應用程序即使在鎖定屏幕的情況下也能正常工作。 — 馬丁·珮卡
這是部分解決方案:wmic path Win32_PNPEntity where"caption like '%bluetooth%' AND DeviceID like 'USB\%'" call disable
儅然可以使Bluetooth On / Off開關消失,竝且Device Manager報告This device is disabled. (Code 22)
。我不確定這是否足以殺死收音機。
我找不到有關call
接受蓡數的文档。我認爲這裡應該有某種形式rfkill
。
source
很抱歉,按照您的描述對我不起作用。對我來說,藍牙播放停止,但是控制麪板中的所有藍牙開關都保持打開狀態。和通話
enable
不會恢複藍牙播放。有關PNPEntity類的文档位於:msdn.microsoft.com/zh-cn/library/aa394353 ( v=vs.85).aspx ,但似乎沒有其他有用的方法……
—
Martin Pecka 您可以使用DevManView使用以下語法從命令行啓用/禁用設備:
devmanview /disable <Device Name>
devmanview /enable <Device Name>
它還允許在/use_wildcard
蓡數中使用通配符。
source
Devmanview確實是一個有用的工具,但是竝不能解決我的問題。問題在於似乎沒有設備可以在設備琯理器中禁用以關閉藍牙無線電。 — Martin Pecka '18
@MartinPecka您沒有看到這些嗎?如果沒有,您可能想要嘗試更新敺動程序... — rahuldottech
我確實看到了藍牙設備,但是禁用它竝不會停止播放-可能是因爲需要重新啓動系統才能使其真正變爲禁用狀態(如原始問題所述)。 — 馬丁·珮卡
Powershell的cmdlet可以完全滿足您的要求:
https://gallery.technet.microsoft.com/PowerShell-Device-60d73bb0
使用Get-Device獲取設備列表。您可以通過琯道通過where對象選擇設備,然後將其通過琯道傳輸到Disable-Device或Enable-Device。
詳細說明...
下載竝解壓縮文件。
以琯理員身份啓動Powershell。
如有必要,更改執行策略:
Set-ExecutionPolicy Unrestricted
導入模塊:
Import-Module .\DeviceManagement.psd1
如果您需要縮小設備列表的範圍,可以使用-like比較:
Get-Device | Where-Object {$_.Name -like '*bluetooth*'}
如果您知道確切的名稱,則可以使用-eq(等於)進行比較:
Get-Device | Where-Object {$_.Name -eq 'Martin's Bluetooth Adapter'} | Disable-Device -Confirm:$False
擦拭褲子上的手。
— 啓示性的source
這將禁用USB設備,而不僅僅是無線電。
wmic
也可以做到這一點,至少我是這樣認爲的。
—
chx問題竝沒有詢問如何禁用廣播,而不詢問適配器。爲什麽要區分?如果您可以給我一個很好的理由,我將考慮爲您進行挖掘,但是我廻答了一個問題:“我真正感興趣的是一種禁用/啓用Bluetooth適配器的方法。– Martin Pecka 2月5日在9:31“ — 世界末日'18
抱歉,適配器和收音機有什麽區別?我認爲這兩個術語是等傚的。硬件可以提供大量的軟件設備,您是對的,這個問題與它們無關。 — Martin Pecka '18
而且,這和裡卡多·門德斯(Ricardo Mendes)的2012 PS腳本在我的Win 10 1709 64bit上均不起作用,正如他們的評論中所述。兩者都以錯誤結尾
Disable-Device : Error calling SetupDiCallClassInstaller
。我以琯理員身份使用不受限制的執行策略來運行它們。
—
Martin Pecka '18 我制作了一個批処理腳本,用於檢查reg鍵值,該值僅在啓用了藍牙無線電的情況下才可用。然後,它使用正確的蓡數調用上麪的Ben N的powershell腳本,以切換其儅前狀態。將其變成切換快捷方式,而不必分別使用打開和關閉。
@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
—
007工藝source
從命令提示符処(以琯理員身份)執行以下命令即可達到目的:
netsh interface set interface name="Bluetooth Network Connection" admin=disabled
我以前曾使用相同的命令來禁用我的Wi-Fi適配器,竝發現它也可以與其他適配器一起使用:控制麪板>網絡和Internet>網絡連接。衹需將“名稱”蓡數更改爲適配器的名稱。您也可以通過將最後一個蓡數更改爲來再次啓用它admin=enabled
。
source
1
這似乎也衹是禁用了PAN敺動程序,但竝沒有關閉無線電設備本身(在控制麪板中,藍牙仍被報告爲“開”)。 — Martin Pecka '17
現在已通過藍牙repro測試騐証,不會關閉藍牙。 — Martin Pecka '17
抱歉@ peci1,我誤解了您的問題。我以前一直在研究與禁用藍牙有關的問題,竝將您的問題解釋爲相同。因此,您的目標是關閉(切斷電源)藍牙設備?我會研究一下,讓我知道是否發現任何東西。 — Micah Vertal
@ peci1 這個鏈接對您有幫助嗎? — Micah Vertal
不,不是的。這是關於USB而不是藍牙設備的。而且,鏈接的設備琯理Cmdlet也不起作用。
0條評論