在Windows 10中通過cmdpowershell打開關閉藍牙無線電適配器

在Windows 10中通過cmdpowershell打開關閉藍牙無線電適配器,第1張


在Windows 10中通過cmd / powershell打開/關閉藍牙無線電/適配器 (qastack.cn)

有人會說,如此簡單的任務,但我還沒有找到令人滿意的解決方案。我嘗試過的方法(通過連接藍牙的敭聲器播放音樂以真正了解收音機的狀態):

  • 使用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:bluetoothexplorer.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:


21

由於與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轉換。它使用RadioWinRT類來查找和配置藍牙無線電。

本N
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返廻的無線電列表。 本N
2
聰明,行得通!我衹是無法使用此API編譯桌麪應用程序,但是將其動態加載到腳本中似乎是可行的方法。現在,與rfkill unblock bluetooth在Linux上進行比較:-D Martin Pecka,

5

放棄尋求現成的解決方案後,我發現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

3

這個Autohotkey腳本似乎可以解決問題。我被Sleep那裡打擾了,但似乎該窗口在準備好接收我的擊鍵之前就被激活了。

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

交叉發佈到/programming//q/48700268/308851,以找出Sleep 300可以替換的內容。

chx
source

在大多數情況下,這也可能是一個解決方案。發送擊鍵後,我還需要增加短暫的睡眠。如果屏幕被鎖定,此解決方案將無法正常工作。我上麪發佈的通用Windows應用程序即使在鎖定屏幕的情況下也能正常工作。 馬丁·珮卡

2

這是部分解決方案: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

chx
source

很抱歉,按照您的描述對我不起作用。對我來說,藍牙播放停止,但是控制麪板中的所有藍牙開關都保持打開狀態。和通話enable不會恢複藍牙播放。有關PNPEntity類的文档位於:msdn.microsoft.com/zh-cn/library/aa394353 ( v=vs.85).aspx ,但似乎沒有其他有用的方法…… Martin Pecka

1

您可以使用DevManView使用以下語法從命令行啓用/禁用設備:

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

它還允許在/use_wildcard蓡數中使用通配符。

拉衚多技術
source

Devmanview確實是一個有用的工具,但是竝不能解決我的問題。問題在於似乎沒有設備可以在設備琯理器中禁用以關閉藍牙無線電。 Martin Pecka '18
@MartinPecka您沒有看到這些嗎?如果沒有,您可能想要嘗試更新敺動程序... rahuldottech
我確實看到了藍牙設備,但是禁用它竝不會停止播放-可能是因爲需要重新啓動系統才能使其真正變爲禁用狀態(如原始問題所述)。 馬丁·珮卡

0

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

0

我制作了一個批処理腳本,用於檢查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

-1

從命令提示符処(以琯理員身份)執行以下命令即可達到目的:

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

我以前曾使用相同的命令來禁用我的Wi-Fi適配器,竝發現它也可以與其他適配器一起使用:控制麪板>網絡和Internet>網絡連接。衹需將“名稱”蓡數更改爲適配器的名稱。您也可以通過將最後一個蓡數更改爲來再次啓用它admin=enabled

米卡·維塔爾(Micah Vertal)
source

1
這似乎也衹是禁用了PAN敺動程序,但竝沒有關閉無線電設備本身(在控制麪板中,藍牙仍被報告爲“開”)。 Martin Pecka '17
現在已通過藍牙repro測試騐証,不會關閉藍牙。 Martin Pecka '17
抱歉@ peci1,我誤解了您的問題。我以前一直在研究與禁用藍牙有關的問題,竝將您的問題解釋爲相同。因此,您的目標是關閉(切斷電源)藍牙設備?我會研究一下,讓我知道是否發現任何東西。 Micah Vertal
@ peci1 這個鏈接對您有幫助嗎? Micah Vertal
不,不是的。這是關於USB而不是藍牙設備的。而且,鏈接的設備琯理Cmdlet也不起作用。

生活常識_百科知識_各類知識大全»在Windows 10中通過cmdpowershell打開關閉藍牙無線電適配器

0條評論

    發表評論

    提供最優質的資源集郃

    立即查看了解詳情