web-dev-qa-db-ja.com

Windows 10でcmd / powershellからBluetoothラジオ/アダプタのオン/オフを切り替えます

そのような単純な作業は言うだろう、そして私は満足のいく解決策を見つけていない。私が試したことは(音楽がラジオの状態を本当に知るためにBluetooth接続されたスピーカーを通して演奏することで):

  • devconをadmin:devcon disable USB\VID_8087&PID_07DC&REV_0001(これは私のBluetoothアダプタのハードウェアIDです)として使用しています...機能するには再起動が必要です...
  • admin:Disable-NetAdapter "Bluetooth Network Connection 3"(これは私のBluetoothアダプタの名前の翻訳です)としてpowershellを使用しています...それはPANドライバを無効にしますが、Bluetoothスピーカーは音楽を再生し続けます...
  • adminとしてnetを使用する:net stop bthserv...は実際にはラジオをオフにしません(BTスピーカーは音楽を再生し続けます)
  • .NETを使用する: MSDNの最も関連性の高いページ では、アダプタのオン/オフについてWordを使用していません。
  • エクスプローラーを使用して:ms-settings:bluetoothまたはExplorer.exe %LocalAppData%\Packages\windows.immersivecontrolpanel_cw5n1h2txyewy\LocalState\Indexed\Settings\cs-CZ\AAA_SettingsPagePCSystemBluetooth.settingcontent-ms...はBluetooth設定パネルを開きますが、それでもトグルボタンをクリックする必要があります

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

25
Martin Pecka

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

Bluetoothをオフにするには、代わりにOffを渡します。

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

powershell -command .\bluetooth.ps1 -BluetoothStatus On

警告:Bluetoothサポートサービスが実行されていない場合、WinRTはBluetooth無線を認識しないため、スクリプトはそれを開始しようとします。残念ながら、スクリプトが管理者として実行されていないとサービスを開始できません。これを不要にするには、そのサービスのスタートアップの種類を自動に変更します。

それでは、もう少し説明しましょう。最初の3行はスクリプトが受け取るパラメータを設定します。本格的に始める前に、Bluetoothサポートサービスが起動していることを確認し、起動していない場合は起動します。次に、 System.Runtime.WindowsRuntime メソッドを使用してWinRT形式のタスク(.NET/PowerShellでは理解できない)を次のように変換できるようにWindowsRuntimeSystemExtensions.AsTaskアセンブリを読み込みます。 .NET Task その特定のメソッドには、PowerShellのオーバーロードの解決を失敗させるように思われるさまざまなパラメータセットが大量に含まれているため、次の行では、結果のWinRTタスクのみを実行する特定のものを取得します。次に、非同期WinRTタスクから適切な型の結果を抽出するために数回使用する関数を定義します。その関数の宣言に続いて、私たちは WinRTメタデータから必要な2つの型をロードします 。スクリプトの残りの部分は、ほとんどあなたがあなたの答えで書いたC#コードのPowerShellの翻訳です。 Bluetooth無線の検索と設定には、 Radio WinRTクラスを使用します。

16
Ben N

既製のソリューションを探すのをあきらめた後、私はUniversal Windows Platformアプリが ラジオコントロール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" />

また、コマンドラインから制御できるようにするには、App.xaml.csのメソッドprotected override async void OnActivated(IActivatedEventArgs args)をオーバーライドして、次のようにブランチで処理を行う必要があります。

switch (args.Kind)
        {
            case ActivationKind.CommandLineLaunch:
3
Martin Pecka

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

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

Sleep 300を置き換えることができるものを理解するために、 https://stackoverflow.com/q/48700268/308851 にクロスポストしました。

2
chx

これは部分的な解決策です:wmic path Win32_PNPEntity where "caption like '%bluetooth%' AND DeviceID like 'USB\\%'" call disableは確実にBluetoothオン/オフスイッチを消し、Device ManagerはThis device is disabled. (Code 22)を報告します。ラジオを殺すのにそれが十分であるかどうか、私は確信が持てない。

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

1
chx

Powershellには、あなたが求めているものを正確に実行するためのコマンドレットがあります。

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

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

詳細な説明.

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

AdminとしてPowerShellを起動します。

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

Set-ExecutionPolicy Unrestricted

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

Import-Module .\DeviceManagement.psd1

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

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

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

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

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

0
apocalysque

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

devmanview /disable <Device Name>   
devmanview /enable <Device Name>    

ワイルドカードを/use_wildcard引数と共に使用することもできます。

0
rahuldottech

私はあなたのブルートゥースラジオが可能にされた場合にだけその場にあるだろうregキー値をチェックするバッチスクリプトを作りました。それはそれから現在の状態を切り替えるために正しいパラメータで上記のベン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
0
007craft