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タグwikiのスクリプトの有効化セクションの手順に従って、システムでスクリプトの実行を有効にします。次に、次のようなPowerShellプロンプトから実行できます。
.\bluetooth.ps1 -BluetoothStatus On
Bluetoothをオフにするには、Off
代わりに合格します。
バッチファイルから実行するには:
powershell -command .\bluetooth.ps1 -BluetoothStatus On
警告: Bluetoothサポートサービスが実行されていない場合、スクリプトはそれを開始しようとします。そうでない場合、WinRTはBluetooth無線を認識しません。残念ながら、スクリプトが管理者として実行されていない場合、サービスを開始できません。これを不要にするために、そのサービスのスタートアップの種類を自動に変更できます。
さて、説明のために。最初の3行は、スクリプトが取るパラメーターを確立します。本格的に始める前に、Bluetoothサポートサービスが実行されていることを確認し、実行されていない場合は開始します。次に、System.Runtime.WindowsRuntime
アセンブリをロードして、。スクリプトの残りの部分は、回答で記述したC#コードのPowerShell変換にほぼ相当します。WinRTクラスを使用して、Bluetooth無線を見つけて構成します。WindowsRuntimeSystemExtensions.AsTask
メソッドを使用してWinRTスタイルのタスク(.NET / PowerShellが認識しない)を.NETに変換ますTask
。この特定のメソッドには、PowerShellのオーバーロードの解決につまずくように見えるさまざまなパラメーターセットのボートロードがあるため、次の行では、結果のあるWinRTタスクのみを受け取る特定のメソッドを取得します。次に、非同期WinRTタスクから適切なタイプの結果を抽出するために数回使用する関数を定義します。その関数の宣言に続いて、WinRTメタデータから2つの必要なタイプをロードしますRadio