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.WindowsRuntimeWindowsRuntimeSystemExtensions.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.