Windows 10'da Bluetooth radyoyu / adaptörünü cmd / powershell'den açıp kapatma


28

Böyle basit bir görev, birisinin söyleyebileceği gibi tatmin edici bir çözüm bulamadım. Ne denedim (radyonun durumunu gerçekten bilmek için Bluetooth bağlantılı bir hoparlörden müzik çalmakla):

  • admin olarak devcon kullanma: devcon disable USB\VID_8087&PID_07DC&REV_0001(ki bu Bluetooth adaptörümün HW kimliği) ... çalışmak için yeniden başlatmayı gerektiriyor ...
  • powershell'i admin olarak kullanmak: Disable-NetAdapter "Bluetooth Network Connection 3"(ki bu Bluetooth adaptörümün adının çevirisidir) ... PAN sürücüsünü devre dışı bırakır, ancak Bluetooth hoparlörü müzik çalmaya devam eder ...
  • net'i admin olarak kullanmak: net stop bthserv... aslında radyoyu kapatmıyor (BT hoparlörü müzik çalmaya devam ediyor)
  • .NET kullanarak: MSDN'deki en alakalı sayfa , adaptörü açıp kapama hakkında bir kelime söylemiyor.
  • Explorer’ı kullanarak: ms-settings:bluetoothveya explorer.exe %LocalAppData%\Packages\windows.immersivecontrolpanel_cw5n1h2txyewy\LocalState\Indexed\Settings\cs-CZ\AAA_SettingsPagePCSystemBluetooth.settingcontent-ms... Bluetooth ayarları panelini açar, ancak yine de geçişe tıklamam gerekiyor

Microsoft'un böyle bir komut vermeyecek kadar cahil olacağına inanamıyorum ...


Müziği nasıl çalıyorsun?
harrymc


Winamp'ı öldürmek müziği durdurur mu?
harrymc

Tabii ki neden olmasın? Ancak soru, müzik çalmayı durdurmakla ilgili değil, BT radyonun kontrolü ile ilgili.
Martin Pecka

1
@harrymc Lütfen soruyu okuyun. Müzik çalma, Bluetooth bağlantısının canlı olup olmadığını tespit etmenin bir yoludur. Gerçekten ilgilendiğim şey, Bluetooth adaptörünü devre dışı bırakmanın / etkinleştirmenin gerçekten bir yoludur.
Martin Pecka

Yanıtlar:


21

WinRT ile gerekli birlikte çalışma nedeniyle bu zor, ancak saf PowerShell'de mümkündür:

[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

Kullanmak için, bir PS1 dosyası, örneğin kaydedin bluetooth.ps1. Henüz yapmadıysanız, sisteminizde komutların yürütülmesini sağlamak için PowerShell etiketi wiki'nin Kodları Etkinleştirme bölümündeki talimatları izleyin . Sonra bunu şöyle bir PowerShell isteminden çalıştırabilirsiniz:

.\bluetooth.ps1 -BluetoothStatus On

Bluetooth'u kapatmak için Offyerine

Bir toplu iş dosyasından çalıştırmak için:

powershell -command .\bluetooth.ps1 -BluetoothStatus On

Uyarı: Bluetooth Destek Servisi çalışmıyorsa, komut dosyası başlatmaya çalışır çünkü Aksi takdirde, WinRT Bluetooth radyolarını görmez. Ne yazık ki, komut dosyası yönetici olarak çalışmıyorsa hizmet başlatılamaz. Bunu gereksiz kılmak için, bu hizmetin başlangıç ​​türünü otomatik olarak değiştirebilirsiniz.

Şimdi biraz açıklama için. İlk üç satır, betiğin aldığı parametreleri belirler. En ciddi şekilde başlamadan önce, Bluetooth Destek Hizmetinin çalıştığından emin olur ve çalıştırmazsak başlatırız. Ardından, WinRT stili görevleri (hangi .NET / PowerShell'in anlamadığını) .NET s'ye dönüştürmek System.Runtime.WindowsRuntimeiçin bu WindowsRuntimeSystemExtensions.AsTaskyöntemi kullanabilmemiz için derlemeyi yüklüyoruz Task. Bu özel yöntem, PowerShell'in aşırı yük çözünürlüğünü arttırıyor gibi görünen farklı parametre setlerinden oluşan bir tekne yüküne sahip, bu nedenle bir sonraki satırda yalnızca sonuçta WinRT görevi alan belirli bir tane elde ettik. Ardından, zaman uyumsuz bir WinRT görevinden uygun türde bir sonuç çıkarmak için birkaç kez kullanacağımız bir işlev tanımlarız. Bu işlevin bildiriminin ardından, WinRT meta verilerinden iki gerekli tür yüklüyoruz. Komut dosyasının geri kalanı hemen hemen yanıtınıza yazdığınız C # kodunun bir PowerShell çevirisidir; RadioBluetooth radyosunu bulmak ve yapılandırmak için WinRT sınıfını kullanır .


1
Boş değerli bir ifade için bir yöntem çağıramazsınız. C: \ Users \ chx \ AppData \ Local \ Microsoft \ WindowsApps \ bluetooth.ps1: 18 char: 1 + Bekleniyor ($ bluetooth.SetStateAsync ($ BluetoothStatus))) ([Windows.Devices.
chx

@chx Makinenizin bir Bluetooth adaptörü olduğundan emin misiniz? Bluetooth radyosu yoksa, üçüncü-son hat $bluetoothboş olarak belirlenir ve bu da ikinci-son hattın bu hatayı üretmesine neden olur.
Ben N,

"Ayarlar" uygulamasında göründüğünden% 100 eminim ve kablosuz olarak müzik dinliyorum ve hem Aygıt Yöneticisi hem de wmic de bunu rapor ediyor.
chx

@chx Hmm, son üç satırı sadece değiştirirseniz ne elde edersiniz $radios? Bu WinRT'nin geri gönderdiği radyoların listesini gösterecektir.
Ben N

2
Zeki, işe yarıyor! Bu API'yi kullanarak bir masaüstü uygulamasını derleyemedim, ancak bir betiğe dinamik olarak yükleme işlemi yolunda gözüküyor. Şimdi, rfkill unblock bluetoothLinux ile karşılaştır :-D
Martin Pecka

5

Hazır çözümler aramaktan vazgeçtikten sonra, Universal Windows Platform uygulamalarının radyo kontrol API'sine erişimi olduğunu öğrendim .

Bu yüzden komut satırı kontrollü bir uygulamayla örnek bir radyo kontrol uygulamasını birleştirdim ve sonuç burada: https://github.com/peci1/RadioControl . Bu oluyor , Windows Mağazası'nda yayınlanmış .

Genelde, uygulamanın arka planda çalışmasına izin vermek mümkün değildir, bu yüzden önce GUI'yi başlatmanız gerekir, sonra da onu komut satırından çağırabilirsiniz.

radiocontrol.exe 0 on
radiocontrol.exe Bluetooth off

Bu uygulamanın ihtiyaç duyduğu temel özellikler şunlardır:

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

Ardından, uygulama bildirimine Radyolar özelliğini de eklemeniz gerekir:

<DeviceCapability Name="radios" />

Ve komut satırından kontrol yapılmasına izin vermek için protected override async void OnActivated(IActivatedEventArgs args), App.xaml.cs'deki metodu geçersiz kılmanız ve böyle bir dalda işlemi yapmanız gerekir :

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

Bu cevap StackOverflow'a daha iyi uyar.
harrymc

@MartinPecka Şans eseri, bağlantısı kesilmiş Bluetooth donanımını nasıl yeniden bağlayacağınızı biliyor musunuz Disable/Enable-NetAdapter? superuser.com/questions/1444278/…
JinSnow

3

Bu Autohotkey betiği hile yapıyor gibi görünüyor. SleepOrada rahatsız oldum ama benim tuş vuruşlarımı almaya hazır olmadan önce pencere aktif hale geliyor.

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

Neyin değiştirilebileceğini bulmak için, /programming//q/48700268/308851 numaralı telefona Crossposted Sleep 300.


Bu, çoğu durumda da bir çözüm olabilir. Tuş vuruşlarını gönderdikten sonra kısa bir uyku eklemem gerekiyordu. Ve ekran kilitliyse bu çözüm işe yaramaz. Yukarıda yayınlanan Universal Windows uygulaması kilitli ekranla bile çalışıyor.
Martin Pecka

2

İşte kısmi bir çözüm: wmic path Win32_PNPEntity where "caption like '%bluetooth%' AND DeviceID like 'USB\\%'" call disablekesinlikle Bluetooth Açık / Kapalı anahtarının kaybolmasını sağlar ve Aygıt Yöneticisi raporları This device is disabled. (Code 22). Telsizi öldürmek için yeterli olup olmadığından emin değilim.

Hangi argümanların callkabul ettiği ile ilgili belgeleri bulamıyorum . rfkillBurada bir çeşit olması gerektiğini düşünüyorum .


Üzgünüm, tanımladığınız gibi benim için çalışmıyor. Benim için, Bluetooth çalma durur, ancak kontrol panelindeki tüm bluetooth anahtarları açık kalır. Ve ile arama enableBluetooth çalma işlemine devam etmez. PNPEntity sınıfı ile ilgili belgeler şurada: msdn.microsoft.com/en-us/library/aa394353(v=vs.85).aspx , ancak başka hiçbir yararlı yöntem var gibi görünmüyor ...
Martin Pecka

1

Bu sözdizimini kullanarak bir aygıtı komut satırından etkinleştirmek / devre dışı bırakmak için DevManView'ü kullanabilirsiniz :

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

Ayrıca, joker karakterlerin /use_wildcardargümanla kullanılmasına da izin verir .


Devmanview gerçekten faydalı bir araçtır, fakat sorunumu çözmüyor. Sorun şu ki, Bluetooth radyoyu kapatmak için cihaz yöneticisinde devre dışı bırakabileceğiniz bir cihaz görünmüyor.
Martin Pecka

@MartinPecka Bunlardan hiçbirini görmüyor musunuz? i.stack.imgur.com/UrOuc.png Değilse, sürücüleri denemek ve güncellemek isteyebilirsiniz ...
rahuldottech

Bluetooth cihazını görüyorum, ancak devre dışı bırakmak çalma işlemini durdurmuyor - muhtemelen sistemin gerçekten devre dışı bırakılması için yeniden başlatılması gerekiyor (orijinal soruda belirtildiği gibi).
Martin Pecka

0

Powershell, tam olarak aradığınızı yapmak için cmdlet'lere sahip:

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

Cihazların listesini almak için Get-Device kullanın. Cihazınızı seçmek için bunu nesneyi nereye yönlendirebilir ve sonra Aygıtı Devre Dışı Bırak veya Aygıtı Etkinleştir seçeneğine yönlendirebilirsiniz.

Detaylı talimatlar...

Dosyayı indirin ve açın.

Bir powershell'i admin olarak başlatın.

Gerekirse yürütme politikasını değiştirin:

Set-ExecutionPolicy Unrestricted

Modülü alın:

Import-Module .\DeviceManagement.psd1

Aygıt listesini daraltmanız gerekirse, benzer bir karşılaştırma kullanabilirsiniz:

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

Eğer tam adı biliyorsanız, bir -eq (eşittir) karşılaştırmasını kullanabilirsiniz:

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

Pantolonların üzerinde ellerinizi silin.


Bu, yalnızca radyo yerine USB cihazını devre dışı bırakacaktır. wmicBunu da yapabilir, en azından öyle düşünüyorum.
chx

Soru, telsizin nasıl devre dışı bırakılacağını değil, bağdaştırıcıyı değil. Neden ayrım? Bana iyi bir sebep verebilirseniz sizin için kazmayı düşüneceğim, ancak “Gerçekten ilgilendiğim şey gerçekten Bluetooth adaptörünü devre dışı bırakmak / etkinleştirmek için bir yol.” Sorusunu yanıtladım. - Martin Pecka 5 Şubat at 9:31 "
kıyamet

Üzgünüm, adaptör ve radyo arasındaki fark nedir? Bu iki terimi eşdeğer olarak görüyorum. Bu HW şeyinin sağladığı bir sürü yazılım aygıtı var ve bu sorunun haklı değil.
Martin Pecka

Dahası, hem bu hem de Ricardo Mendes'den 2012 PS senaryosu, Win 10 1709 64bit'imde yorumlarında belirtildiği gibi çalışmaz. Her ikisi de hata ile bitiyor Disable-Device : Error calling SetupDiCallClassInstaller. Onları yönetici olarak ve sınırsız yürütme politikasıyla çalıştırıyorum.
Martin Pecka

0

Sadece bluetooth radyonuz etkinleştirildiyse yerinde olacak bir reg anahtar değerini kontrol eden bir toplu komut dosyası hazırladım. Daha sonra, Ben N’in powershell betiğini, mevcut durumunu değiştirmek için doğru parametreyle çağırır. Ayrı ayrı açmak ve kapatmak zorunda kalmak yerine, geçiş kısayoluna dönüştürür.

@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

Aşağıdaki komutu Komut İstemi'nden (yönetici olarak) uygulamak hile yapmıştır:

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

Daha önce Wi-Fi adaptörümü devre dışı bırakmak için aynı komutu kullanmıştım ve diğer adaptörlerle de çalıştığını gördüm: Denetim Masası> Ağ ve İnternet> Ağ Bağlantıları. Sadece "name" değişkenini adaptörünüzün ismiyle değiştirin. Son argümanı değiştirerek de tekrar etkinleştirebilirsiniz admin=enabled.


1
Bu aynı zamanda PAN sürücüleri devre dışı bırakıyor gibi görünüyor, ancak radyo cihazının kendisini kapatmıyor (kontrol panelinde, Bluetooth hala "açık" olarak bildiriliyor).
Martin Pecka

Bluetooth repro testi tarafından şimdi doğrulandı, bluetooth kapanmıyor.
Martin Pecka

Üzgünüm @ peci1, sorunuzu yanlış anladım. Daha önce Bluetooth'u devre dışı bırakmakla ilgili sorulara bakıyordum ve sorunuzu aynı şekilde yorumlamıştım. Yani amacınız Bluetooth cihazını kapatmak (gücü kesmek)? Biraz araştırma yapacağım ve bir şey bulursam size haber vereceğim.
Micah Vertal,

@ peci1 bu link hiç faydalı olur mu?
Micah Vertal,

Hayır, değil. Bluetooth hakkında değil USB ile ilgili. Bağlantılı Aygıt Yönetimi Cmdlet'i de çalışmıyor.
Martin Pecka
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.