Takie proste zadanie, można powiedzieć, i nie znalazłem satysfakcjonującego rozwiązania. Co próbowałem (z muzyką odtwarzaną przez głośnik podłączony do Bluetooth, aby naprawdę poznać stan radia):
- używanie devcon jako administratora:
devcon disable USB\VID_8087&PID_07DC&REV_0001
(który jest HW ID mojego adaptera Bluetooth) ... wymaga ponownego uruchomienia do pracy ... - używanie PowerShell jako admin:
Disable-NetAdapter "Bluetooth Network Connection 3"
(co jest tłumaczeniem nazwy mojego adaptera Bluetooth) ... wyłącza sterownik PAN, ale głośnik Bluetooth kontynuuje odtwarzanie muzyki ... - używanie net jako admin:
net stop bthserv
... tak naprawdę nie wyłącza radia (głośnik BT kontynuuje odtwarzanie muzyki) - using .NET: Najbardziej odpowiednia strona w MSDN nie mówi ani słowa o włączaniu / wyłączaniu adaptera.
- using explorer:
ms-settings:bluetooth
orexplorer.exe %LocalAppData%\Packages\windows.immersivecontrolpanel_cw5n1h2txyewy\LocalState\Indexed\Settings\cs-CZ\AAA_SettingsPagePCSystemBluetooth.settingcontent-ms
... otwiera panel ustawień Bluetooth, ale nadal muszę kliknąć przełącznik
Nie mogę uwierzyć, że Microsoft byłby tak ignorantem, gdyby nie wydał takiego polecenia ...
windows
windows-10
command-line
bluetooth
Martin Pecka
źródło
źródło
Odpowiedzi:
Jest to trudne ze względu na niezbędną współpracę z WinRT, ale jest to możliwe w czystej PowerShell:
Aby go użyć, zapisz plik PS1, np
bluetooth.ps1
. Jeśli jeszcze tego nie zrobiłeś, postępuj zgodnie z instrukcjami w sekcji Włączanie skryptów wiki tagu PowerShell, aby włączyć wykonywanie skryptów w systemie. Następnie możesz uruchomić go z wiersza polecenia programu PowerShell w następujący sposób:Aby wyłączyć Bluetooth, przekaż
Off
zamiast.Aby uruchomić go z pliku wsadowego:
Zastrzeżenie: Jeśli usługa wsparcia Bluetooth nie jest uruchomiona, skrypt próbuje ją uruchomić, ponieważ w przeciwnym razie WinRT nie zobaczy radia Bluetooth. Niestety usługi nie można uruchomić, jeśli skrypt nie działa jako administrator. Aby było to niepotrzebne, możesz zmienić typ uruchamiania tej usługi na automatyczny.
Teraz trochę wyjaśnienia. Pierwsze trzy wiersze określają parametry, które przyjmuje skrypt. Zanim zaczniemy na poważnie, upewnimy się, że usługa pomocy technicznej Bluetooth jest uruchomiona i uruchom ją, jeśli nie. Następnie ładujemy
System.Runtime.WindowsRuntime
zestaw, abyśmy mogli użyćWindowsRuntimeSystemExtensions.AsTask
metody do konwersji zadań w stylu WinRT (których .NET / PowerShell nie rozumie) na .NETTask
. Ta konkretna metoda ma mnóstwo różnych zestawów parametrów, które wydają się wyzwalać rozdzielczość przeciążenia PowerShell, więc w następnym wierszu otrzymujemy konkretny, który przyjmuje tylko wynikowe zadanie WinRT. Następnie definiujemy funkcję, której użyjemy kilka razy, aby wyodrębnić wynik odpowiedniego typu z asynchronicznego zadania WinRT. Po deklaracji tej funkcji ładujemy dwa niezbędne typy z metadanych WinRT. Pozostała część skryptu to właściwie tylko tłumaczenie PowerShell kodu C # napisanego w odpowiedzi; używaRadio
klasy WinRT do wyszukiwania i konfigurowania radia Bluetooth.źródło
$bluetooth
na zero, co spowoduje, że linia od ostatniej do ostatniej spowoduje wystąpienie tego błędu.$radios
? To pokaże listę radiotelefonów, które zwrócił WinRT.rfkill unblock bluetooth
Linuksa :-DPo rezygnacji z poszukiwania gotowych rozwiązań dowiedziałem się, że aplikacje platformy Universal Windows mają dostęp do interfejsu API sterowania radiowego .
Połączyłem więc przykładową aplikację do sterowania radiowego z aplikacją sterowaną za pomocą wiersza poleceń, a wynik jest tutaj: https://github.com/peci1/RadioControl . Jest opublikowany w Windows Store .
Ogólnie rzecz biorąc, nie można po prostu pozwolić aplikacji działać w tle, więc najpierw musisz uruchomić GUI, a następnie możesz wywołać go z wiersza poleceń, np.
Podstawowe funkcje tej aplikacji to:
Następnie musisz również dodać funkcję Radia do manifestu aplikacji:
Aby umożliwić kontrolę z wiersza poleceń, musisz przesłonić metodę
protected override async void OnActivated(IActivatedEventArgs args)
w App.xaml.cs i wykonać przetwarzanie w gałęzi takiej jak ta:źródło
Disable/Enable-NetAdapter
? superuser.com/questions/1444278/…Ten skrypt Autohotkey wydaje się załatwić sprawę. Niepokoi mnie to
Sleep
, ale wydaje się, że okno staje się aktywne, zanim będzie gotowe na odbieranie moich naciśnięć klawiszy.Przesłano na /programming//q/48700268/308851, aby dowiedzieć się, co
Sleep 300
można by zastąpić.źródło
Oto częściowe rozwiązanie: z
wmic path Win32_PNPEntity where "caption like '%bluetooth%' AND DeviceID like 'USB\\%'" call disable
pewnością powoduje zniknięcie przełącznika włączania / wyłączania Bluetooth i zgłasza Menedżer urządzeńThis device is disabled. (Code 22)
. Czy to wystarczy, żeby zabić radio, nie jestem pewien.Nie mogę znaleźć dokumentacji dotyczącej
call
akceptowanych argumentów . Myślę, że tutaj powinno być coś takiegorfkill
.źródło
enable
nie wznawia odtwarzania Bluetooth. Dokumentacja dotycząca klasy PNPEntity znajduje się tutaj: msdn.microsoft.com/en-us/library/aa394353(v=vs.85).aspx , ale wydaje się, że nie ma innych przydatnych metod ...Możesz użyć DevManView, aby włączyć / wyłączyć urządzenie z wiersza poleceń, używając następującej składni:
Pozwala także na użycie symboli wieloznacznych z
/use_wildcard
argumentem.źródło
Powershell ma polecenia cmdlet do robienia dokładnie tego, czego szukasz:
https://gallery.technet.microsoft.com/PowerShell-Device-60d73bb0
Użyj Get-Device, aby uzyskać listę urządzeń. Możesz potokować to przez obiekt-miejsce, aby wybrać urządzenie, a następnie potokować to do Wyłącz urządzenie lub Włącz urządzenie.
Szczegółowe instrukcje...
Pobierz i rozpakuj plik.
Uruchom PowerShell jako administrator.
W razie potrzeby zmień zasady wykonywania:
Zaimportuj moduł:
Jeśli chcesz zawęzić listę urządzeń, możesz użyć porównania podobnego do:
Jeśli znasz dokładną nazwę, możesz użyć -eq (równa się):
Wytrzyj ręce w spodnie.
źródło
wmic
też mogę to zrobić, przynajmniej tak mi się wydaje.Disable-Device : Error calling SetupDiCallClassInstaller
. Prowadzę je jako administrator i z nieograniczoną polityką wykonywania.Zrobiłem skrypt wsadowy, który sprawdza wartość klucza reg, która byłaby dostępna tylko wtedy, gdy radio Bluetooth było włączone. Następnie wywołuje powyższy skrypt Powershell Ben N z poprawnym parametrem, aby przełączyć jego bieżący stan. Zmienia go w skrót przełączający, zamiast konieczności osobnego włączania i wyłączania.
źródło
Wykonanie następującego polecenia z wiersza polecenia (jako administrator) załatwiło sprawę:
Wcześniej użyłem tego samego polecenia, aby wyłączyć moją kartę Wi-Fi, i stwierdziłem, że działa ona również z innymi kartami w: Panel sterowania> Sieć i Internet> Połączenia sieciowe. Wystarczy zmienić argument „name” na nazwę adaptera. Możesz także włączyć go ponownie, zmieniając ostatni argument na
admin=enabled
.źródło