Core/Public/Radio/Set-RadioState.ps1
|
function Set-RadioState { [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [ValidateSet("On", "Off")] [string]$State, [Parameter()] [string]$Name, [Parameter()] [int]$Index, [Parameter(ValueFromPipeline = $true)] [Windows.Devices.Radios.Radio]$InputObject ) process { $EnumState = [Windows.Devices.Radios.RadioState]::$State $TargetRadios = @() # 1. Prioriteit: Direct object uit de pipeline if ($null -ne $InputObject) { $TargetRadios = @($InputObject) } else { # 2. Haal alle radio's op voor filtering $AllRadios = @(Get-RadioState) # Filter op Naam (als opgegeven) if (-not [string]::IsNullOrWhiteSpace($Name)) { $TargetRadios = $AllRadios | Where-Object { $_.Name -like "*$Name*" } } else { $TargetRadios = $AllRadios } # 3. Limiteer op Index (als opgegeven) if ($PSBoundParameters.ContainsKey('Index')) { if ($Index -lt $TargetRadios.Count) { $TargetRadios = @($TargetRadios[$Index]) } else { Write-Error "Index $Index buiten bereik van de (gefilterde) selectie." return } } } # 4. Voer de actie uit foreach ($Radio in $TargetRadios) { $AsyncOp = $Radio.SetStateAsync($EnumState) while ($AsyncOp.Status -eq [Windows.Foundation.AsyncStatus]::Started) { Start-Sleep -Milliseconds 50 } $Status = $AsyncOp.GetResults() if ($Status -eq 'Allowed') { Write-Host "SUCCES: $($Radio.Name) staat nu $State" -ForegroundColor Green } else { Write-Warning "MISLUKT: $($Radio.Name) geeft status $Status" } } } } $RadioNameCompleter = { param($CommandName, $ParameterName, $WordToComplete, $CommandAst, $FakeBoundParameters) # Gebruik je eigen functie om de huidige radio's op te halen # We vangen eventuele fouten op voor het geval de DLL's nog niet geladen zijn try { $Radios = @(Get-RadioState) $Radios.Name | Where-Object { $_ -like "$WordToComplete*" } | ForEach-Object { [System.Management.Automation.CompletionResult]::new($_, $_, 'ParameterValue', $_) } } catch { # Geen actie bij fout, dan simpelweg geen suggesties } } Register-ArgumentCompleter -CommandName 'Set-RadioState' -ParameterName 'Name' -ScriptBlock $RadioNameCompleter $RadioIndexCompleter = { param($CommandName, $ParameterName, $WordToComplete, $CommandAst, $FakeBoundParameters) try { # 1. Haal alle radio's op $Radios = @(Get-RadioState) # 2. Kijk of de 'Name' parameter al is ingevuld door de gebruiker if ($FakeBoundParameters.ContainsKey('Name')) { $Filter = $FakeBoundParameters['Name'] $Radios = $Radios | Where-Object { $_.Name -like "*$Filter*" } } # 3. Genereer index-suggesties (0, 1, 2...) met de naam van de radio als tooltip for ($i = 0; $i -lt $Radios.Count; $i++) { $CompletionText = $i.ToString() $ListItemText = "$i ($($Radios[$i].Name))" # Wat je ziet in de lijst $ToolTip = "Selecteer index $($i): $($Radios[$i].Name)" [System.Management.Automation.CompletionResult]::new($CompletionText, $ListItemText, 'ParameterValue', $ToolTip) } } catch { # Geen actie bij fout } } Register-ArgumentCompleter -CommandName 'Set-RadioState' -ParameterName 'Index' -ScriptBlock $RadioIndexCompleter |