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 클래스를.