Private/ArgumentCompleters7.ps1
|
$ScriptBlockSetRadioStateIndexPS7 = { param($CommandName, $ParameterName, $WordToComplete) # 1. Zoek de sessie (blijf proberen zolang de gebruiker tapt) #$Session = Get-PSSession | Where-Object { $_.ConfigurationName -like "*WinPS*" -or $_.Name -like "*WinPS*" } | Select-Object -First 1 while ($script:MyWiFiSession.State -ne 'Opened') { Start-Sleep -Seconds 1 } # 2. Check of de sessie 'Opened' is EN of onze functie al bestaat if ($script:MyWiFiSession -and $script:MyWiFiSession.State -eq 'Opened') { $RadioData = Invoke-Command -Session $script:MyWiFiSession -ScriptBlock { # Check of de functie al geladen is in de 5.1 sessie if (Get-Command Get-RadioState -ErrorAction SilentlyContinue) { $i = 0 Get-RadioState | ForEach-Object { "$i|$($_.Name)"; $i++ } } } -ErrorAction SilentlyContinue if ($RadioData) { foreach ($Line in $RadioData) { $Parts = $Line.Split('|') if ($Parts[0] -like "$WordToComplete*") { [System.Management.Automation.CompletionResult]::new($Parts[0], "$($Parts[0]): $($Parts[1])", 'ParameterValue', $Parts[1]) } } } } } $ScriptBlockSetRadioStateSetStatePS7 = { param($CommandName, $ParameterName, $WordToComplete) # We definiëren de opties als een lijst van objecten voor makkelijke verwerking $States = @( @{ Value = 'On'; Alias = '1'; Tooltip = 'Zet de radio aan' }, @{ Value = 'Off'; Alias = '0'; Tooltip = 'Zet de radio uit' } ) foreach ($S in $States) { # Check of wat de gebruiker typt matcht met de Naam OF de numerieke Alias if ($S.Value -like "$WordToComplete*" -or $S.Alias -like "$WordToComplete*") { [System.Management.Automation.CompletionResult]::new( $S.Value, # De tekst die daadwerkelijk wordt ingevuld (On/Off) "$($S.Alias): $($S.Value)", # Wat de gebruiker ziet in het menu (1: On) 'ParameterValue', $S.Tooltip # Extra info bij selectie ) } } } $ScriptBlockConnectWifiNetworkWifiReconnectionKindPS7 = { param($CommandName, $ParameterName, $WordToComplete) $States = @( @{ Value = 'Automatic'; Alias = '0'; Tooltip = 'Connects automatically when in range.' }, @{ Value = 'Manual'; Alias = '1'; Tooltip = 'User must connect manually.' } ) $CompletionResults = New-Object System.Collections.Generic.List[System.Management.Automation.CompletionResult] foreach ($S in $States) { if ($S.Value -like "$WordToComplete*" -or $S.Alias -like "$WordToComplete*") { $CompletionResults.Add([System.Management.Automation.CompletionResult]::new( $S.Value, "$($S.Alias): $($S.Value)", 'ParameterValue', $S.Tooltip )) } } return $CompletionResults } $ScriptBlockArgumentCompleterSsidPS7 = { param ($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameters) # 1. Directe Exit bij Hidden if ($fakeBoundParameters.ContainsKey('Hidden')) { return [System.Management.Automation.CompletionResult]::new(" ", "SSID Unknown (Hidden Mode)", 'Text', "With a hidden network you need to enter the SSID manually") } #$Session = Get-PSSession | Where-Object { $_.ConfigurationName -like "*WinPS*" -or $_.Name -like "*WinPS*" } | Select-Object -First 1 while ($script:MyWiFiSession.State -ne 'Opened') { Start-Sleep -Seconds 1 } # 2. Haal WiFi data op via PowerShell 5.1 (onder water) # We vangen de output op als JSON om de objectstructuur te behouden in PS 7 $allNetworks = Invoke-Command -session $script:MyWiFiSession -ScriptBlock { if (Get-Command Search-WifiNetworksPrivate -ErrorAction SilentlyContinue) { Search-WifiNetworksPrivate | Select-Object Ssid, Bssid, NetworkRssiInDecibelMilliwatts, SignalBars } } -ErrorAction SilentlyContinue # 3. Filtering op BSSID (indien meegegeven) $givenBssid = $fakeBoundParameters['Bssid'] if ($givenBssid) { $cleanGiven = $givenBssid -replace '[^0-9A-Fa-f]' $allNetworks = $allNetworks | Where-Object { ($_.Bssid -replace '[^0-9A-Fa-f]') -eq $cleanGiven } } # 4. Bouw de lijst voor de Tab-completion $allNetworks | Where-Object { ![string]::IsNullOrWhiteSpace($_.Ssid) } | Group-Object Ssid | ForEach-Object { $_.Group | Sort-Object NetworkRssiInDecibelMilliwatts -Descending | Select-Object -First 1 } | Sort-Object NetworkRssiInDecibelMilliwatts -Descending | ForEach-Object { $strongest = $_ # Voeg quotes toe als er spaties in de SSID zitten $ssidValue = if ($strongest.Ssid -match ' ') { "`"$($strongest.Ssid)`"" } else { $strongest.Ssid } $displayText = "$($strongest.Ssid) ($($strongest.SignalBars * 20)% / $($strongest.NetworkRssiInDecibelMilliwatts) dBm)" if ($strongest.Ssid -like "$wordToComplete*") { [System.Management.Automation.CompletionResult]::new($ssidValue, $displayText, 'ParameterValue', "BSSID: $($strongest.Bssid)") } } } $ScriptBlockArgumentCompleterBssidPS7 = { param($CommandName, $ParameterName, $WordToComplete, $CommandAst, $FakeBoundParameters) # 1. Connection Guard: Wait for the WinPS session to be ready while ($script:MyWiFiSession.State -ne 'Opened') { Start-Sleep -Milliseconds 100 } # 2. Fetch WiFi data via the existing PowerShell 5.1 Session # Using Invoke-Command to bridge the gap to WinPS $AvailableNetworks = Invoke-Command -Session $script:MyWiFiSession -ScriptBlock { if (Get-Command Search-WifiNetworksPrivate -ErrorAction SilentlyContinue) { # Return raw data for processing in PS7 Search-WifiNetworksPrivate | Select-Object Ssid, Bssid, NetworkRssiInDecibelMilliwatts, SignalBars, ChannelCenterFrequencyInKilohertz } } -ErrorAction SilentlyContinue if (-not $AvailableNetworks) { return } # 3. Context Filtering (Filter by SSID if provided in the command line) $FilterSsid = if ($FakeBoundParameters.ContainsKey('Ssid')) { $FakeBoundParameters['Ssid'] -replace '["'']', '' } else { $null } $ShowHidden = $FakeBoundParameters.ContainsKey('Hidden') $Results = New-Object System.Collections.Generic.List[System.Management.Automation.CompletionResult] foreach ($Net in ($AvailableNetworks | Sort-Object NetworkRssiInDecibelMilliwatts -Descending)) { $IsSsidEmpty = [string]::IsNullOrWhiteSpace($Net.Ssid) $HasSsidFilter = -not [string]::IsNullOrWhiteSpace($FilterSsid) # Logic: Determine if this BSSID should be shown based on SSID/Hidden parameters $IsMatch = switch ($true) { ($HasSsidFilter -and $ShowHidden) { $IsSsidEmpty; break } ($HasSsidFilter) { ($Net.Ssid -eq $FilterSsid); break } ($ShowHidden) { $IsSsidEmpty; break } default { (-not $IsSsidEmpty); break } } if ($IsMatch) { # Prepare Labels and Tooltips $Label = if ($IsSsidEmpty) { "$($Net.Bssid) [HIDDEN]" } else { "$($Net.Bssid) ($($Net.Ssid))" } $SignalPercent = "$($Net.SignalBars * 20)%" $Tooltip = "Signal: $SignalPercent ($($Net.NetworkRssiInDecibelMilliwatts) dBm)" # Filter by what the user has already typed ($WordToComplete) if ($Net.Bssid -like "$WordToComplete*") { $Results.Add([System.Management.Automation.CompletionResult]::new( $Net.Bssid, $Label, 'ParameterValue', $Tooltip )) } } } # 4. Fallback: Prevent default CLI history help if no matches are found if ($Results.Count -eq 0) { $Results.Add([System.Management.Automation.CompletionResult]::new(" ", "No BSSID match in range", 'Text', "No network found matching current filters")) } return $Results } $null = $ScriptBlockSetRadioStateIndexPS7, ` $ScriptBlockSetRadioStateSetStatePS7, ` $ScriptBlockArgumentCompleterSsidPS7, ` $ScriptBlockConnectWifiNetworkWifiReconnectionKindPS7, ` $ScriptBlockArgumentCompleterBssidPS7 |