สิ่งนี้มีความท้าทายเนื่องจากการทำงานร่วมกันที่จำเป็นกับ 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 Task
s วิธีการเฉพาะนั้นมีจำนวนชุดพารามิเตอร์ที่แตกต่างกันซึ่งดูเหมือนจะเพิ่มความละเอียดของการโอเวอร์โหลดของ PowerShell ดังนั้นในบรรทัดถัดไปเราจะได้ชุดที่เฉพาะซึ่งใช้งาน WinRT ที่เป็นผลลัพธ์เท่านั้น จากนั้นเราจะกำหนดฟังก์ชั่นที่เราจะใช้หลาย ๆ ครั้งเพื่อแยกผลลัพธ์ของประเภทที่เหมาะสมจากงาน WinRT แบบอะซิงโครนัส หลังจากการประกาศฟังก์ชันนั้นเราโหลดสองประเภทที่จำเป็นจากข้อมูลเมตา WinRT. ส่วนที่เหลือของสคริปต์นั้นเป็นเพียงการแปล PowerShell ของรหัส C # ที่คุณเขียนไว้ในคำตอบของคุณ มันใช้Radio
คลาส WinRT เพื่อค้นหาและกำหนดค่าวิทยุ Bluetooth