WinRT ile gerekli birlikte çalışma nedeniyle bu zor, ancak saf PowerShell'de mümkündür:
[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
Kullanmak için, bir PS1 dosyası, örneğin kaydedin bluetooth.ps1
. Henüz yapmadıysanız, sisteminizde komutların yürütülmesini sağlamak için PowerShell etiketi wiki'nin Kodları Etkinleştirme bölümündeki talimatları izleyin . Sonra bunu şöyle bir PowerShell isteminden çalıştırabilirsiniz:
.\bluetooth.ps1 -BluetoothStatus On
Bluetooth'u kapatmak için Off
yerine
Bir toplu iş dosyasından çalıştırmak için:
powershell -command .\bluetooth.ps1 -BluetoothStatus On
Uyarı: Bluetooth Destek Servisi çalışmıyorsa, komut dosyası başlatmaya çalışır çünkü Aksi takdirde, WinRT Bluetooth radyolarını görmez. Ne yazık ki, komut dosyası yönetici olarak çalışmıyorsa hizmet başlatılamaz. Bunu gereksiz kılmak için, bu hizmetin başlangıç türünü otomatik olarak değiştirebilirsiniz.
Şimdi biraz açıklama için. İlk üç satır, betiğin aldığı parametreleri belirler. En ciddi şekilde başlamadan önce, Bluetooth Destek Hizmetinin çalıştığından emin olur ve çalıştırmazsak başlatırız. Ardından, WinRT stili görevleri (hangi .NET / PowerShell'in anlamadığını) .NET s'ye dönüştürmek System.Runtime.WindowsRuntime
için bu WindowsRuntimeSystemExtensions.AsTask
yöntemi kullanabilmemiz için derlemeyi yüklüyoruz Task
. Bu özel yöntem, PowerShell'in aşırı yük çözünürlüğünü arttırıyor gibi görünen farklı parametre setlerinden oluşan bir tekne yüküne sahip, bu nedenle bir sonraki satırda yalnızca sonuçta WinRT görevi alan belirli bir tane elde ettik. Ardından, zaman uyumsuz bir WinRT görevinden uygun türde bir sonuç çıkarmak için birkaç kez kullanacağımız bir işlev tanımlarız. Bu işlevin bildiriminin ardından, WinRT meta verilerinden iki gerekli tür yüklüyoruz. Komut dosyasının geri kalanı hemen hemen yanıtınıza yazdığınız C # kodunun bir PowerShell çevirisidir; Radio
Bluetooth radyosunu bulmak ve yapılandırmak için WinRT sınıfını kullanır .