Windows 10でcmd / powershellからBluetooth無線/アダプターをオン/オフにします


28

このような単純なタスクは、言うだろう、と私は満足できる解決策を見つけていません。私が試したこと(Bluetoothに接続されたスピーカーで音楽を再生して、ラジオの状態を本当に知る):

  • devconを管理者として使用する:(devcon disable USB\VID_8087&PID_07DC&REV_0001これはBluetoothアダプターのHW IDです)...再起動が必要です...
  • powershellを管理者として使用:(Disable-NetAdapter "Bluetooth Network Connection 3"これは私のBluetoothアダプターの名前の翻訳です)... PANドライバーを無効にしますが、Bluetoothスピーカーは音楽を再生し続けます...
  • 管理者としてネットを使用: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... Bluetooth設定パネルを開きますが、トグルをクリックする必要があります

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


どのように音楽を演奏していますか?
ハリーマク

Winampの使用:)
マーティンペッカ

Winampを殺すと音楽が止まりますか?
harrymc

もちろん、なぜそうならないのでしょうか?しかし、問題は音楽の再生を停止することではなく、BTラジオを制御することです。
マーティンペッカ

1
@harrymc質問を読んでください。音楽の再生は、Bluetooth接続が有効かどうかを検出する方法の1つです。私が本当に興味があるのは、Bluetoothアダプターを無効/有効にする方法です。
マーティンペッカ

回答:


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タグ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


1
null値の式でメソッドを呼び出すことはできません。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うーん、最後の3行をjustに置き換えるとどうなります$radiosか?これにより、WinRTが返した無線のリストが表示されます。
ベンN

2
賢い、うまくいく!このAPIを使用してデスクトップアプリをコンパイルすることはできませんでしたが、スクリプトで動的に読み込むのが方法のようです。rfkill unblock bluetoothLinux での比較:-D
Martin Pecka

5

既製のソリューションを模索することをあきらめた後、ユニバーサルWindowsプラットフォームアプリが 無線制御APIに

そこで、サンプルの無線制御アプリとコマンドライン制御アプリをマージしました。結果はhttps://github.com/peci1/RadioControlです。それは Windowsストアに公開します

一般的に、アプリをバックグラウンドで実行することはできないため、最初に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機能を追加する必要もあります。

<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置き換えられるものを見つけます


ほとんどの場合、これも解決策になります。キーストロークを送信した後、短いスリープも追加する必要がありました。また、画面がロックされている場合、このソリューションは機能しません。上記のユニバーサルWindowsアプリは、ロックされた画面でも機能します。
マーティンペッカ

2

部分的な解決策は次のとおりです。wmic path Win32_PNPEntity where "caption like '%bluetooth%' AND DeviceID like 'USB\\%'" call disable確かにBluetoothオン/オフスイッチを非表示にし、デバイスマネージャーが報告しThis device is disabled. (Code 22)ます。それがラジオを殺すのに十分かどうかはわかりません。

どの引数がcall受け入れるかについてのドキュメントを見つけることができません。rfkillここに何かあるはずだと思う。


ごめんなさい、あなたがそれを説明するように私のために働かない。私にとっては、Bluetoothの再生は停止しますが、コントロールパネルのすべてのBluetoothスイッチはオンのままです。また、を呼び出して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は確かに便利なツールですが、私の問題は解決しません。問題は、デバイスマネージャで無効にしてBluetooth無線をオフにできるデバイスがないように見えることです。
マーティンペッカ

@MartinPeckaこれらのどれも見ませんか?i.stack.imgur.com/UrOuc.pngそうでない場合は、ドライバーを更新してみてください...
rahuldottech

Bluetoothデバイスは表示されますが、無効にしても再生は停止しません。おそらく、元の質問で述べたように、実際に無効にするにはシステムを再起動する必要があるためです。
マーティンペッカ

0

Powershellには、まさに求めていることを実行するためのコマンドレットがあります。

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

Get-Deviceを使用して、デバイスのリストを取得します。それをwhere-objectにパイプしてデバイスを選択し、それをDisable-DeviceまたはEnable-Deviceにパイプすることができます。

詳細な手順...

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

管理者としてPowerShellを起動します。

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

Set-ExecutionPolicy Unrestricted

モジュールをインポートします。

Import-Module .\DeviceManagement.psd1

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

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

質問では、無線ではなくアダプターを無効にする方法を尋ねませんでした。なぜ区別するのですか?正当な理由があれば、掘り下げることを検討しますが、「私が本当に興味を持っているのは、Bluetoothアダプターを無効/有効にする方法です。」という質問に答えました。– Martin Pecka 2月5日
9:31

申し訳ありませんが、アダプターとラジオの違いは何ですか?これら2つの用語は同等であると考えます。このHWが提供するソフトウェアデバイスはたくさんありますが、この質問はデバイスに関するものではありません。
マーティンペッカ

さらに、このコメントとRicardo Mendesの2012 PSスクリプトは、コメントで述べられているように、私のWin 10 1709 64ビットでは機能しません。両方ともエラーになりますDisable-Device : Error calling SetupDiCallClassInstaller。管理者として、無制限の実行ポリシーでそれらを実行します。
マーティンペッカ

0

Bluetooth無線が有効になっている場合にのみ存在する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はまだ「オン」として報告されています)。
マーティンペッカ

Bluetooth再現テストで検証済み。Bluetoothはオフになりません。
マーティンペッカ

ごめんなさい、@ peci1、あなたの質問を誤解した。私は以前にBluetoothの無効化に関する質問を見ていて、あなたの質問を同じものと解釈していました。あなたの目標は、Bluetoothデバイスの電源を切る(電源を切る)ことですか?少し調べて、何か見つかったらお知らせします。
ミカヴァータル

@ peci1 このリンクは役に立ちますか?
ミカヴァータル

いいえ、違います。Bluetoothデバイスではなく、USBについてです。また、リンクされたデバイス管理コマンドレットも機能しません。
マーティンペッカ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.