Windows 10의 cmd / powershell에서 Bluetooth 라디오 / 어댑터 켜기 / 끄기


28

이러한 간단한 작업은 만족할만한 해결책을 찾지 못했습니다. 내가 시도한 것 (무선 상태를 실제로 알기 위해 블루투스로 연결된 스피커를 통해 음악을 재생하는 경우) :

  • devcon을 관리자로 사용 : devcon disable USB\VID_8087&PID_07DC&REV_0001(내 Bluetooth 어댑터의 HW ID) ... 작동하려면 재부팅해야합니다 ...
  • powershell을 관리자로 사용 : Disable-NetAdapter "Bluetooth Network Connection 3"(내 Bluetooth 어댑터 이름을 번역 함) ... PAN 드라이버를 비활성화하지만 Bluetooth 스피커는 계속 음악을 재생합니다 ...
  • 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... 블루투스 설정 패널을 열지 만 여전히 토글을 클릭해야합니다

Microsoft가 그러한 명령을 제공하지 않기 때문에 무지하다고 믿을 수는 없습니다 ...


당신은 어떻게 음악을 연주합니까?
— harrymc

Winamp 사용 :)
— Martin Pecka

Winamp를 죽이면 음악이 멈추나요?
— harrymc

물론 그렇지 않은 이유는 무엇입니까? 그러나 문제는 음악 재생 중지에 관한 것이 아니라 BT 라디오의 제어에 관한 것입니다.
— Martin Pecka

1
@harrymc 질문을 읽으십시오. 음악 재생은 Bluetooth 연결이 활성화되어 있는지 여부를 감지하는 방법입니다. 내가 정말로 관심이있는 것은 실제로 블루투스 어댑터를 비활성화 / 활성화하는 방법입니다.
— Martin Pecka

답변:


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 태그 위키 의 스크립트 사용 가능 섹션에있는 지시 사항 에 따라 시스템에서 스크립트를 실행하십시오. 그런 다음 PowerShell 프롬프트에서 다음과 같이 실행할 수 있습니다.

.\bluetooth.ps1 -BluetoothStatus On

블루투스를 끄려면 Off대신 전달하십시오 .

배치 파일에서 실행하려면

powershell -command .\bluetooth.ps1 -BluetoothStatus On

주의 사항 : Bluetooth 지원 서비스가 실행되고 있지 않으면 스크립트가이를 시작하려고 시도합니다. 그렇지 않으면 WinRT가 Bluetooth 라디오를 볼 수 없기 때문입니다. 아아, 스크립트가 관리자로 실행되고 있지 않으면 서비스를 시작할 수 없습니다. 이를 불필요하게하기 위해 해당 서비스의 시작 유형을 자동으로 변경할 수 있습니다.

이제 몇 가지 설명을하겠습니다. 처음 세 줄은 스크립트가 취하는 매개 변수를 설정합니다. 본격적으로 시작하기 전에 Bluetooth 지원 서비스가 실행 중인지 확인하고 그렇지 않은 경우 시작합니다. 그런 다음 System.Runtime.WindowsRuntime이 WindowsRuntimeSystemExtensions.AsTask메서드를 사용하여 WinRT 스타일 작업 (.NET / PowerShell이 ​​이해하지 못하는)을 .NET으로 변환 할 수 있도록 어셈블리 를로드합니다 Task. 이 특정 방법에는 PowerShell의 과부하 해결을 방해하는 다양한 매개 변수 집합이 포함되어 있으므로 다음 줄에서는 결과적인 WinRT 작업 만 수행하는 특정 방법을 얻습니다. 그런 다음 비동기 WinRT 작업에서 적절한 유형의 결과를 추출하기 위해 여러 번 사용할 함수를 정의합니다. 이 함수의 선언에 따라 WinRT 메타 데이터에서 필요한 두 가지 유형을로드합니다.. 스크립트의 나머지 부분은 답변에 작성한 C # 코드의 PowerShell 번역 일뿐입니다. 그것은 사용 Radio발견하고 Bluetooth 무선을 구성 할 수 WinRT 클래스를.


1
널값 표현식에서는 메소드를 호출 할 수 없습니다. C : \ Users \ chx \ AppData \ Local \ Microsoft \ WindowsApps \ bluetooth.ps1 : 18 char : 1 + Await ($ bluetooth.SetStateAsync ($ BluetoothStatus)) ([Windows.Devices.
— chx

@chx 제품에 Bluetooth 어댑터가 있습니까? Bluetooth 무선 장치가없는 경우 마지막 3 번째 줄은 $bluetoothnull로 설정 되어 마지막 2 번째 줄에서 해당 오류가 발생합니다.
— 벤 N

100 % "설정"앱에서 볼 수 있으며 무선으로 음악을 듣고 장치 관리자와 wmic 모두보고합니다.
— chx

@chx 흠, 마지막 세 줄을 그냥 바꾸면 어떻게 $radios됩니까? WinRT가 반환 한 라디오 목록이 표시됩니다.
— 벤 N

2
영리합니다. 이 API를 사용하여 데스크톱 앱을 컴파일 할 수는 없었지만 스크립트에서 동적으로로드하는 것이 좋습니다. 이제 rfkill unblock bluetoothLinux 와 비교하십시오 :
— -D

5

기성품 솔루션을 찾기 위해 포기한 후에 Universal Windows Platform 앱이 무선 제어 API에 액세스 할 수 있음을 알게되었습니다 .

그래서 샘플 무선 제어 응용 프로그램을 명령 줄 제어 응용 프로그램과 병합했으며 결과는 https://github.com/peci1/RadioControl 입니다. 그것은 것 윈도우 스토어에 게시 .

일반적으로 앱을 백그라운드에서 실행하는 것은 불가능하므로 먼저 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);

그런 다음 앱 매니페스트에 라디오 기능을 추가해야합니다.

<DeviceCapability Name="radios" />

그리고 커맨드 라인에서 제어 할 수 있도록 protected override async void OnActivated(IActivatedEventArgs args)App.xaml.cs의 메소드를 재정의 하고 다음과 같이 분기에서 처리를 수행해야합니다.

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

이 답변은 StackOverflow에 더 적합합니다.
— harrymc

@MartinPecka 우연히도 연결이 끊긴 Bluetooth 하드웨어를 다시 연결하는 방법을 알고 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.


이것은 또한 대부분의 경우 해결책이 될 수 있습니다. 키 스트로크를 보낸 후 잠을 추가해야했습니다. 화면이 잠겨 있으면이 솔루션이 작동하지 않습니다. 위에 게시 한 Universal Windows 앱은 잠금 화면에서도 작동합니다.
— Martin Pecka

2

부분적인 해결책은 다음과 같습니다. wmic path Win32_PNPEntity where "caption like '%bluetooth%' AND DeviceID like 'USB\\%'" call disable확실히 블루투스 켜기 / 끄기 스위치가 사라지고 장치 관리자가보고합니다 This device is disabled. (Code 22). 그것이 라디오를 죽일 정도로 충분하든 확실하지 않습니다.

어떤 인수가 call허용 되는지에 대한 문서를 찾을 수 없습니다 . 나는 rfkill여기에 어떤 종류가 있어야한다고 생각 합니다.


죄송하지만 설명에 따라 작동하지 않습니다. 저에게는 블루투스 재생이 멈추지 만 제어판의 모든 블루투스 스위치는 켜져 있습니다. 와 통화 enable해도 Bluetooth 재생이 다시 시작되지 않습니다. PNPEntity 클래스에 대한 설명서는 다음과 같습니다. msdn.microsoft.com/en-us/library/aa394353(v=vs.85).aspx 그러나 다른 유용한 방법은없는 것 같습니다 ...
— Martin Pecka

1

다음 구문을 사용하여 DevManView 를 사용하여 명령 줄에서 장치를 활성화 / 비활성화 할 수 있습니다 .

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

또한 /use_wildcard인수 와 함께 와일드 카드를 사용할 수 있습니다 .


Devmanview는 실제로 유용한 도구이지만 내 문제를 해결하지 못합니다. 문제는 장치 관리자에서 블루투스 라디오를 끌 수있는 장치가없는 것 같습니다.
— Martin Pecka

@MartinPecka이 중 아무것도 보이지 않습니까? i.stack.imgur.com/UrOuc.png 하지 않으면, 당신이 시도 및 업데이트 드라이버 ... 할 수 있습니다
— rahuldottech

Bluetooth 장치가 보이지만 비활성화하면 재생이 중지되지 않습니다. 아마도 원래 질문에서 설명한 것처럼 실제로 비활성화하기 위해 시스템을 다시 시작해야하기 때문일 수 있습니다.
— Martin Pecka

0

Powershell에는 원하는 것을 정확하게 수행하기위한 cmdlet이 있습니다.

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

Get-Device를 사용하여 장치 목록을 가져옵니다. where-object를 통해 장치를 선택하고 Disable-Device 또는 Enable-Device로 파이프 할 수 있습니다.

자세한 지침 ...

파일을 다운로드하고 압축을 푸십시오.

관리자 권한으로 powershell을 시작하십시오.

필요한 경우 실행 정책을 변경하십시오.

Set-ExecutionPolicy Unrestricted

모듈을 가져옵니다.

Import-Module .\DeviceManagement.psd1

장치 목록을 좁히려면 비슷한 비교를 사용할 수 있습니다.

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

정확한 이름을 알고 있다면 -eq (같음) 비교를 사용할 수 있습니다.

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

바지를 닦습니다.


라디오 대신 USB 장치가 비활성화됩니다. wmic적어도 그렇게 생각합니다.
— chx

질문은 라디오가 아닌 어댑터를 비활성화하는 방법을 묻지 않았습니다. 왜 구별이 필요한가? 만약 당신이 나에게 좋은 이유를 줄 수 있다면, 나는 당신을 위해 파는 것을 고려할 것이지만, 나는 "내가 정말로 관심이있는 것은 실제로 블루투스 어댑터를 비활성화 / 활성화하는 방법이다"라는 질문에 대답했다. – Martin Pecka 9:31 "
— apocalysque

죄송합니다. 어댑터와 라디오의 차이점은 무엇입니까? 이 두 용어가 동등하다고 생각합니다. 이 HW가 제공하는 *** 소프트웨어 장치가 많이 있으며,이 질문에 관한 것이 아닙니다.
— Martin Pecka

또한이 의견과 Ricardo Mendes의 2012 PS 스크립트는 의견에 언급 된 바와 같이 내 Win 10 1709 64 비트에서 작동하지 않습니다. 둘 다 오류로 끝납니다 Disable-Device : Error calling SetupDiCallClassInstaller. 나는 관리자 권한으로 실행 정책을 무제한으로 실행합니다.
— Martin Pecka

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

-1

관리자 권한으로 명령 프롬프트에서 다음 명령을 실행하여 트릭을 수행했습니다.

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

이전에 동일한 명령을 사용하여 Wi-Fi 어댑터를 비활성화했으며 제어판> 네트워크 및 인터넷> 네트워크 연결의 다른 어댑터와도 작동한다는 것을 알았습니다. "name"인수를 어댑터 이름으로 변경하십시오. 마지막 인수를로 변경하여 다시 활성화 할 수도 있습니다 admin=enabled.


1
이것은 또한 PAN 드라이버를 비활성화하는 것처럼 보이지만 라디오 장치 자체를 끄지는 않습니다 (제어판에서 Bluetooth는 여전히 "켜짐"으로보고 됨).
— Martin Pecka

블루투스 재현 테스트로 지금 확인되었으며 블루투스를 끄지 않습니다.
— Martin Pecka

@ peci1 죄송합니다. 귀하의 질문을 오해했습니다. 이전에 블루투스 사용 중지 와 관련된 질문을보고 있었고 귀하의 질문을 동일하게 해석했습니다. 그래서 당신의 목표는 블루투스 장치 를 끄는 것 (전원을 끄는 것)입니까? 나는 조금 연구하고 내가 발견하면 알려 드리겠습니다.
— Micah Vertal

@ peci1 이 링크 가 전혀 도움 이 되겠습니까 ?
— Micah Vertal

아니 그렇지 않아. 그것은 블루투스 장치가 아니라 USB에 관한 것입니다. 연결된 장치 관리 Cmdlet도 작동하지 않습니다.
— Martin Pecka
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.