Windows 10でBluetoothラジオ/アダプターをcmd/powershellからオン/オフする

このような単純な作業ですが、私は満足のいく解決策を見つけられずにいます。試してみたこと(ラジオの状態を知るために、Bluetooth接続のスピーカーから音楽を流しています)。

  • 管理者としてdevconを使用します。devcon disable USBVID_8087&PID_07DC&REV_0001` (これは私のBluetoothアダプタのHW IDです)...働くために再起動が必要です...。
  • 管理者としてパワーシェルを使用します。Disable-NetAdapter "Bluetooth Network Connection 3"` (これは私のBluetoothアダプタの名前の翻訳です)... それはPANドライバを無効にしますが、Bluetoothスピーカーは音楽を再生し続けています...
  • 管理者として net を使用しています。net stop bthserv`... 実際にはラジオはオフになりません (BTスピーカーは音楽を再生し続けます)
  • .NETを使用しています。MSDN の最も関連性の高いページ には、アダプタのオン/オフについて一言も書かれていません。
  • エクスプローラーを使用する。using explorer: ms-settings:bluetooth or explorer.exe %LocalAppData%Packages\windows.immersivecontrolpanel_cw5n1h2txyewy\LocalStateIndexed\Settingscs-CZ\AAA_SettingsPagePCSystemBluetooth.settingcontent-ms... opens the Bluetooth settings panel, but I still have toclick on the toggle

マイクロソフトがそのようなコマンドを提供しないとは信じられません...。

質問へのコメント (6)
ソリューション

これは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をオフにするには、代わりに「オフ」を渡します。

バッチファイルから実行するには:

powershell -command .\bluetooth.ps1 -BluetoothStatus On

警告: Bluetoothサポートサービスが実行されていない場合、WinRTにBluetooth無線が表示されないため、スクリプトはそれを起動しようとします。 悲しいかな、スクリプトが管理者として実行されていない場合、サービスを開始できません。 これが不要になるには、そのサービスの起動タイプを自動に変更できます。

さて、いくつかの説明のために。 最初の3行は、スクリプトが取るパラメーターを確立します。 真剣に取り組む前に、Bluetoothサポートサービスが実行されていることを確認し、実行されていない場合は開始します。 次に、 System.Runtime.WindowsRuntimeアセンブリをロードして、[WindowsRuntimeSystemExtensions.AsTask](https://msdn.microsoft.com/en-us/library/hh79747(v = vs.10)を使用できるようにします。 saspx)メソッドを使用してWinRTスタイルのタスク(which '. その特定のメソッドには、PowerShellのオーバーロード解像度をトリップするように見えるさまざまなパラメーターセットのボートロードがあるため、次の行では、結果として得られるWinRTタスクのみを実行する特定のものを取得します。 次に、非同期WinRTタスクから適切なタイプの結果を抽出するために数回使用する関数を定義します。 その関数の宣言に従って、[WinRTメタデータから2つの必要なタイプをロードします](https://blogs.msdn.microsoft.com/oldnewsing/20180110-00/?p = 97755)。 スクリプトの残りの部分は、回答に書き込んだC#コードのPowerShell翻訳にすぎません。 RadioWinRTクラスを使用して、Bluetoothラジオを見つけて構成します。

解説 (15)

既成の解決策を探すのをあきらめた結果、ユニバーサルWindowsプラットフォームアプリが「無線コントロールAPI」1にアクセスできることがわかりました。

そこで、ラジコンアプリのサンプルとコマンドライン制御のアプリを合体させたのが、こちらhttps://github.com/peci1/RadioControl 。Windowsストアで公開されています2

一般に、アプリをバックグラウンドで実行させることはできないので、まず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);

それから、アプリのマニフェストにRadios機能を追加する必要もあります。

また、コマンドラインからの制御を可能にするために、App.xaml.cs で protected override async void OnActivated(IActivatedEventArgs args) というメソッドをオーバーライドして以下のように処理を分岐させる必要があります。

switch (args.Kind)
        {
            case ActivationKind.CommandLineLaunch:
解説 (2)

このAutohotkeyスクリプトがうまくいくようです。 そこの「スリープ」に悩まされていますが、キーストロークを受け取る準備ができる前にウィンドウがアクティブになるようです。

SendMode Input
Run, ms-settings:bluetooth
WinWaitActive, Settings
Sleep 300
Send,{Tab}{Space}
WinClose, A

https://stackoverflow.com/q/48700268/308851にクロスポストして、その「スリープ300」を何に置き換えることができるかを理解します

解説 (1)

以下は部分的な解決策です: wmic path Win32_PNPEntity where "caption like '%bluetooth%' AND DeviceID like 'USB%'" call disable 確かに Bluetooth On/Off スイッチは消えて、デバイスマネージャは This device is disabled' と報告します。(Code 22)と表示されます。それで無線が切れるかどうかは分かりませんが。

callがどのような引数を受け付けるかについてのドキュメントを見つけることができません。私はここにある種のrfkill` があるべきだと思います。

解説 (1)

DevManViewを使用して、この構文を使用してコマンドラインからデバイスを有効/無効にできます。

devmanview /disable  
devmanview /enable   

また、「/ use_wildcard」引数でワイルドカードを使用することもできます。

解説 (3)

Bluetoothラジオが有効になっている場合にのみ有効になるregキー値をチェックするバッチスクリプトを作成しました。 次に、上記のBen Nのパワーシェルスクリプトに正しいパラメーターを呼び出して、現在の状態を切り替えます。 個別にオンとオフを使用する必要がなく、トグルショートカットに変わります。

@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
解説 (0)

Powershellには、求めていることを正確に行うためのcmdletsがあります。

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

Get-Deviceを使用して、デバイスのリストを取得します。 ウェイオブジェクトを介してパイプし、デバイスを選択してから、Disable-DeviceまたはEnable-Deviceにパイプできます。

詳細な説明。..

ファイルをダウンロードして解凍します。

管理者としてパワーシェルを開始します。

必要に応じて実行ポリシーを変更します。

Set-ExecutionPolicy Unrestricted

モジュールをインポート:

Import-Module .\DeviceManagement.psd1

デバイスのリストを絞り込む必要がある場合は、-like compare :を使用できます。

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

正確な名前がわかっている場合は、-eq(等しい)比較を使用できます。

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

ズボンを拭いてください。

解説 (4)

コマンドプロンプトから(管理者として)以下のコマンドを実行することで、うまくいきました。

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

以前、同じコマンドを使ってWi-Fiアダプターを無効にしたことがありますが、その時、他のアダプターでも使えることがわかりました。コントロールパネル> ネットワークとインターネット> ネットワーク接続。引数の "name" をアダプターの名前に変更するだけです。また、最後の引数を admin=enabled に変更すれば、再び有効にすることができます。

解説 (5)