เปิด / ปิดวิทยุ / อะแดปเตอร์ Bluetooth จาก cmd / powershell ใน Windows 10


28

งานง่าย ๆ อย่างหนึ่งจะพูดและฉันไม่พบวิธีแก้ปัญหาที่น่าพอใจ สิ่งที่ฉันได้ลอง (ด้วยการเล่นเพลงผ่านลำโพงที่เชื่อมต่อกับบลูทู ธ เพื่อทราบสถานะของวิทยุอย่างแท้จริง):

  • ใช้ devcon ในฐานะผู้ดูแลระบบ: devcon disable USB\VID_8087&PID_07DC&REV_0001(ซึ่งเป็น HW ID ของอะแดปเตอร์บลูทู ธ ของฉัน) ... ต้องรีบูตเพื่อให้ทำงานได้ ...
  • ใช้ powershell ในฐานะผู้ดูแลระบบ: Disable-NetAdapter "Bluetooth Network Connection 3"(ซึ่งแปลจากชื่ออะแดปเตอร์บลูทู ธ ของฉัน) ... มันปิดการใช้งานไดรเวอร์ PAN แต่ลำโพงบลูทู ธ ยังเล่นเพลงต่อไป ...
  • ใช้เน็ตในฐานะผู้ดูแลระบบ: net stop bthserv... ไม่ปิดวิทยุจริง ๆ (ลำโพง BT ยังเล่นเพลงต่อไป)
  • ใช้. NET: หน้าที่เกี่ยวข้องมากที่สุดใน MSDNไม่ได้พูดอะไรเกี่ยวกับการเปิด / ปิดอะแดปเตอร์
  • ใช้ explorer: ms-settings:bluetoothหรือexplorer.exe %LocalAppData%\Packages\windows.immersivecontrolpanel_cw5n1h2txyewy\LocalState\Indexed\Settings\cs-CZ\AAA_SettingsPagePCSystemBluetooth.settingcontent-ms... เปิดแผงการตั้งค่าบลูทู ธ แต่ฉันยังต้องคลิกที่สลับ

ฉันไม่อยากจะเชื่อว่า Microsoft จะงมงายที่จะไม่ให้คำสั่งเช่นนั้น ...


คุณเล่นดนตรีได้อย่างไร?
harrymc

ใช้ Winamp :)
Martin Pecka

การฆ่า Winamp หยุดเพลงหรือไม่
harrymc

แน่นอนว่าทำไมมันจะไม่? แต่คำถามไม่ได้เกี่ยวกับการหยุดเล่นเพลง แต่เป็นเรื่องเกี่ยวกับการควบคุมวิทยุ BT
Martin Pecka

1
@harrymc อ่านคำถามได้โปรด การเล่นเพลงเป็นเพียงวิธีที่ฉันตรวจพบว่าการเชื่อมต่อ Bluetooth ยังมีชีวิตอยู่หรือไม่ สิ่งที่ฉันสนใจจริงๆคือวิธีปิดใช้งาน / เปิดใช้งานอะแดปเตอร์ Bluetooth
Martin Pecka

คำตอบ:


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เพื่อเปิดใช้งานการดำเนินการของสคริปต์ในระบบของคุณ จากนั้นคุณสามารถเรียกใช้จากพรอมต์ PowerShell ดังนี้:

.\bluetooth.ps1 -BluetoothStatus On

หากต้องการปิดบลูทู ธ ให้ส่งOffแทน

วิธีรันจากแบตช์ไฟล์:

powershell -command .\bluetooth.ps1 -BluetoothStatus On

ข้อแม้:หากบริการสนับสนุนบลูทู ธ ไม่ได้ทำงานสคริปต์พยายามที่จะเริ่มต้นเพราะมิฉะนั้น WinRT จะไม่เห็นวิทยุบลูทู ธ อนิจจาไม่สามารถเริ่มบริการได้หากสคริปต์ไม่ได้ทำงานในฐานะผู้ดูแลระบบ หากต้องการทำให้ไม่จำเป็นคุณสามารถเปลี่ยนประเภทการเริ่มต้นของบริการนั้นเป็นอัตโนมัติ

ตอนนี้สำหรับคำอธิบายบางอย่าง สามบรรทัดแรกสร้างพารามิเตอร์ที่สคริปต์ใช้ ก่อนที่จะเริ่มอย่างจริงจังเราตรวจสอบให้แน่ใจว่าบริการสนับสนุนบลูทู ธ กำลังทำงานและเริ่มต้นหากไม่ได้ จากนั้นเราจะโหลดSystem.Runtime.WindowsRuntimeการชุมนุมเพื่อให้เราสามารถใช้WindowsRuntimeSystemExtensions.AsTaskวิธีการแปลงงาน WinRT สไตล์ (ซึ่ง .NET / PowerShell ไม่เข้าใจ) เพื่อ .NET Tasks วิธีการเฉพาะนั้นมีจำนวนชุดพารามิเตอร์ที่แตกต่างกันซึ่งดูเหมือนจะเพิ่มความละเอียดของการโอเวอร์โหลดของ PowerShell ดังนั้นในบรรทัดถัดไปเราจะได้ชุดที่เฉพาะซึ่งใช้งาน WinRT ที่เป็นผลลัพธ์เท่านั้น จากนั้นเราจะกำหนดฟังก์ชั่นที่เราจะใช้หลาย ๆ ครั้งเพื่อแยกผลลัพธ์ของประเภทที่เหมาะสมจากงาน WinRT แบบอะซิงโครนัส หลังจากการประกาศฟังก์ชันนั้นเราโหลดสองประเภทที่จำเป็นจากข้อมูลเมตา WinRT. ส่วนที่เหลือของสคริปต์นั้นเป็นเพียงการแปล PowerShell ของรหัส C # ที่คุณเขียนไว้ในคำตอบของคุณ มันใช้Radioคลาส WinRT เพื่อค้นหาและกำหนดค่าวิทยุ Bluetooth


1
คุณไม่สามารถเรียกเมธอดบนนิพจน์ที่มีค่า Null ที่ C: \ Users \ chx \ AppData \ Local \ Microsoft \ WindowsApps \ bluetooth.ps1: 18 ถ่าน: 1 + รอ ($ bluetooth.SetStateAsync ($ BluetoothStatus)) ([Windows อุปกรณ์
chx

@chx คุณแน่ใจหรือว่าเครื่องของคุณมีอะแดปเตอร์บลูทู ธ หากไม่มีวิทยุบลูทู ธ บรรทัดที่สามถึงครั้งสุดท้ายจะถูกตั้งค่า$bluetoothเป็นโมฆะซึ่งจะทำให้บรรทัดที่สองถึงครั้งสุดท้ายทำให้เกิดข้อผิดพลาดนั้น
Ben N

ฉันมั่นใจ 100% ว่าจะปรากฏในแอป "การตั้งค่า" และฉันฟังเพลงแบบไร้สายและทั้ง Device Manager และ wmic ก็รายงานเช่นกัน
chx

@chx อืมคุณจะได้อะไรถ้าคุณแทนที่สามบรรทัดสุดท้ายด้วยแค่$radios? นั่นจะแสดงรายการวิทยุที่ WinRT ส่งคืน
Ben N

2
ฉลาดมันใช้งานได้! ฉันไม่สามารถคอมไพล์แอพเดสก์ท็อปโดยใช้ API นี้ได้ แต่การโหลดมันแบบไดนามิกในสคริปต์ดูเหมือนจะเป็นวิธีที่จะไป เปรียบเทียบrfkill unblock bluetoothกับ Linux :-D
Martin Pecka

5

หลังจากเลิกค้นหาโซลูชันที่ทำเสร็จแล้วฉันพบว่าแอพ Universal Windows Platform สามารถเข้าถึงAPI การควบคุมวิทยุได้

ดังนั้นผมจึงรวมแอปควบคุมวิทยุตัวอย่างกับแอป commandline ควบคุมและผลที่ได้อยู่ที่นี่: https://github.com/peci1/RadioControl มันตีพิมพ์บน Windows ร้าน

โดยทั่วไปแล้วเป็นไปไม่ได้ที่จะปล่อยให้แอปทำงานในพื้นหลังดังนั้นคุณต้องเปิด GUI ก่อนแล้วจึงโทรจาก commandline เช่น

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" />

และเพื่อให้สามารถควบคุมจาก commandline คุณจะต้องแทนที่เมธอดprotected override async void OnActivated(IActivatedEventArgs args)ใน App.xaml.cs และทำการประมวลผลในสาขาดังนี้:

switch (args.Kind)
        {
            case ActivationKind.CommandLineLaunch:

คำตอบนี้เหมาะกับ StackOverflow
harrymc

@MartinPecka โดยบังเอิญคุณรู้วิธีเชื่อมต่อฮาร์ดแวร์บลูทู ธ ที่ถูกตัดการเชื่อมต่อโดยใช้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จะสามารถแทนที่อะไรได้บ้าง


นี่อาจเป็นวิธีแก้ปัญหาในกรณีส่วนใหญ่ ฉันต้องเพิ่มการนอนหลับสั้น ๆ หลังจากส่งการกดแป้น และวิธีนี้ไม่ทำงานหากหน้าจอถูกล็อค แอพ Universal Windows ที่ฉันโพสต์ไว้ด้านบนใช้ได้แม้กับหน้าจอที่ล็อค
Martin Pecka

2

นี่เป็นทางออกที่บางส่วน: wmic path Win32_PNPEntity where "caption like '%bluetooth%' AND DeviceID like 'USB\\%'" call disableแน่นอนทำให้บลูทู ธ สวิตช์เปิด / This device is disabled. (Code 22)ปิดหายไปและรายงาน ไม่ว่าจะเพียงพอที่จะฆ่าวิทยุฉันไม่แน่ใจ

ฉันไม่สามารถหาเอกสารเกี่ยวกับข้อโต้แย้งที่callยอมรับได้ ฉันคิดว่าควรมีบางอย่างrfkillที่นี่


ฉันขอโทษไม่ได้ทำงานให้ฉันตามที่คุณอธิบาย สำหรับฉันแล้วการเล่นบลูทู ธ ก็หยุดลง แต่สวิตช์บลูทู ธ ทั้งหมดในแผงควบคุมยังคงเปิดอยู่ และการโทรด้วยenableจะไม่สามารถเล่นบลูทู ธ ต่อได้ เอกสารเกี่ยวกับคลาส 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 เป็นเครื่องมือที่มีประโยชน์ แต่ก็ไม่ได้แก้ปัญหาของฉัน ปัญหาคือดูเหมือนจะไม่มีอุปกรณ์ที่คุณสามารถปิดการใช้งานในตัวจัดการอุปกรณ์เพื่อปิดวิทยุบลูทู ธ
Martin Pecka

@MartinPecka คุณไม่เห็นสิ่งเหล่านี้หรือไม่ i.stack.imgur.com/UrOuc.pngหากไม่ใช่คุณอาจต้องการลองและอัปเดตไดรเวอร์ ...
rahuldottech

ฉันเห็นอุปกรณ์บลูทู ธ แต่การปิดการใช้งานไม่ได้หยุดการเล่น - อาจเป็นเพราะระบบต้องเริ่มต้นใหม่เพื่อให้ปิดการใช้งานจริง (ตามที่ระบุไว้ในคำถามเดิม)
Martin Pecka

0

Powershell มี cmdlets สำหรับทำสิ่งที่คุณกำลังมองหา:

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

ใช้ Get-Device เพื่อรับรายการอุปกรณ์ คุณสามารถไพพ์ได้จากตำแหน่งที่วัตถุเพื่อหยิบอุปกรณ์ของคุณจากนั้นไปป์นั้นไปที่ Disable-Device หรือ Enable-Device

คำแนะนำโดยละเอียด ...

ดาวน์โหลดและแตกไฟล์

เริ่ม powershell ในฐานะผู้ดูแล

เปลี่ยนนโยบายการปฏิบัติหากจำเป็น:

Set-ExecutionPolicy Unrestricted

นำเข้าโมดูล:

Import-Module .\DeviceManagement.psd1

หากคุณต้องการ จำกัด รายการอุปกรณ์ให้แคบลงคุณสามารถใช้การเปรียบเทียบแบบเหมือน:

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

คำถามไม่ได้ถามว่าจะปิดการใช้งานวิทยุ แต่ไม่ใช่อะแดปเตอร์ ทำไมถึงแตกต่าง? หากคุณสามารถให้เหตุผลที่ดีแก่ฉันฉันจะลองขุดหาคุณ แต่ฉันตอบคำถามที่ถามว่า "สิ่งที่ฉันสนใจจริงๆคือวิธีปิด / เปิดใช้งานอะแดปเตอร์บลูทู ธ จริงๆ - Martin Pecka 5 ก.พ. ที่ 9:31 "
apocalysque

ฉันขอโทษความแตกต่างระหว่างอะแดปเตอร์และวิทยุคืออะไร ฉันพิจารณาคำศัพท์ทั้งสองนี้ที่เทียบเท่ากัน มีอุปกรณ์ซอฟต์แวร์จำนวนมากที่ HW จัดหาให้และคุณพูดถูกคำถามนี้ไม่เกี่ยวกับพวกเขา
Martin Pecka

นอกจากนี้ทั้งสคริปต์ PS ปี 2012 และจาก Ricardo Mendes ไม่ทำงานที่ Win 10 1709 64 บิตของฉันตามที่ระบุไว้ในความคิดเห็นของพวกเขา Disable-Device : Error calling SetupDiCallClassInstallerทั้งสองจะจบลงด้วยข้อผิดพลาด ฉันเรียกใช้พวกเขาในฐานะผู้ดูแลระบบและมีนโยบายการดำเนินการที่ไม่ จำกัด
Martin Pecka

0

ฉันสร้างสคริปต์แบทช์ที่ตรวจสอบค่าคีย์ reg ซึ่งจะใช้งานได้ก็ต่อเมื่อเปิดใช้งานวิทยุบลูทู ธ ของคุณ จากนั้นเรียกสคริปต์ PowerShell ของ 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

-1

การดำเนินการคำสั่งต่อไปนี้จาก Command Prompt (ในฐานะผู้ดูแลระบบ) ทำเคล็ดลับ:

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

ก่อนหน้านี้ฉันเคยใช้คำสั่งเดียวกันเพื่อปิดใช้งานอะแดปเตอร์ Wi-Fi ของฉันและพบว่าสามารถใช้งานร่วมกับอะแดปเตอร์อื่นใน: แผงควบคุม> เครือข่ายและอินเทอร์เน็ต> การเชื่อมต่อเครือข่าย เพียงเปลี่ยนอาร์กิวเมนต์ "ชื่อ" เป็นชื่อของอะแดปเตอร์ของคุณ admin=enabledนอกจากนี้คุณยังสามารถเปิดใช้งานได้อีกครั้งโดยการเปลี่ยนอาร์กิวเมนต์สุดท้ายที่จะ


1
สิ่งนี้ดูเหมือนว่าจะเพียงแค่ปิดการใช้งานไดรเวอร์ PAN แต่ไม่ปิดอุปกรณ์วิทยุเอง (ในแผงควบคุมแสดงว่าบลูทู ธ ยังคงมีสถานะเป็น "เปิด")
Martin Pecka

ตรวจสอบแล้วโดยการทดสอบการทำซ้ำบลูทู ธ อย่าปิดบลูทู ธ
Martin Pecka

ฉันขอโทษ @ peci1 ฉันเข้าใจผิดคำถามของคุณ ก่อนหน้านี้ฉันเคยดูคำถามเกี่ยวกับการปิดใช้งานบลูทู ธ และตีความคำถามของคุณเหมือนกัน ดังนั้นเป้าหมายของคุณคือปิดอุปกรณ์บลูทู ธ ฉันจะทำการวิจัยเล็กน้อยและแจ้งให้คุณทราบหากฉันพบอะไร
คา Vertal

@ peci1 ลิงก์นี้มีประโยชน์หรือไม่?
คา Vertal

ไม่มันไม่ มันเกี่ยวกับ USB ไม่ใช่อุปกรณ์บลูทู ธ และ Cmdlet การจัดการอุปกรณ์ที่เชื่อมโยงไม่ทำงานเช่นกัน
Martin Pecka
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.