💪 Register-ArgumentCompleter, znałeś?

By PowerShell

W funkcji Start-WindowsTerminal, która pomaga w podziale konsoli na panele, wykorzystuje uzupełnianie tabulatorem wartości parametru. W tym przypadku są to dynamiczne parametry, ale do uzyskania efektu wykorzystuję tak i tak atrybut ValidateSet.

Atrybut ValidateSet określa zestaw prawidłowych wartości parametru lub zmiennej i umożliwia uzupełnianie tabulatorem. PowerShell generuje błąd, jeśli parametr lub wartość zmiennej nie pasuje do wartości w zestawie.

function Set-Color {
    param(
        [Parameter(Mandatory)]
        [ValidateSet('Blue','Red','Pink','Green')]
        [string]$Name
    )
    Write-Output "Your color: $Name"
}
uzupełnianie tabulatore - PowerShell

Oprócz takiego sposobów jest jeszcze inny. Mniej znany i znacznie rzadziej wykorzystywany. Mianowicie mowa o…

Register-ArgumentCompleter

Funkcja Register-ArgumentCompleter umożliwia zdefiniowanie uzupełnianie tabulatorem w dowolnej funkcji programu PowerShell za pomocą zaledwie kilku linii kodu.

The Register-ArgumentCompleter cmdlet registers a custom argument completer. An argument completer allows you to provide dynamic tab completion, at run time for any command that you specify.

Zamiast ValidateSet()

Zobacz najprostszy sposób wykorzystania cmdletu do uzyskania podpowiedzi dla parametru.

Po pierwsze utwórz blok skryptu, w którym zdefiniujesz wartości. Dopiero wtedy za pomocą Register-ArgumentCompleter wskaż, dla której funkcji i parametru ma być wykonywane skrypt w momencie naciśnięcia klawisza Tab

function Set-Color {
    param(
        [Parameter(Mandatory)]
        [string]$Name
    )
    Write-Output "Your color: $Name"
}
 
$ScriptBlock = { 'Blue', 'Red', 'Pink', 'Green','Silver'}
Register-ArgumentCompleter -CommandName Set-Color -ParameterName Name -ScriptBlock $ScriptBlock

🧠 Co warto pamiętać, są to tylko podpowiedzi i możliwe jest wskazanie wartości poza zbioru zwracanego przez ScriptBlock. ValidateSet w tym zakresie działa inaczej.

Register-ArgumentCompleter

Dynamiczne definiowanie wartości

Blok skryptu daje nam znacznie więcej możliwości. Pozwala na dynamiczne definiowanie wartości dla parametru. Możemy np. pobrać listę serwerów z pliku CSV lub z Active Directory i dodać ją jako podpowiedź do parametru ComputerName dla cmdletu Enter-PSSession.

$ScriptBlock = {
    Import-Csv -Path 'C:\Temp\servers.csv' | Select-Object -ExpandProperty Servers
}
# wykonaj Invoke-Command aby przetestować swój blok skryptu
# Invoke-Command $ScriptBlock
Register-ArgumentCompleter -CommandName Enter-PSSession -ParameterName ComputerName -ScriptBlock $ScriptBlock
 
# Wykorzystanie AD
$ScriptBlock = {
    $param = @{
        Filter = '*'
        SearchBase = "OU=Servers,DC=centrala,DC=bzwbk"
        Property = 'Name'    
    }
    Get-ADComputer @param | Select-Object -ExpandProperty Name
}
# wykonaj Invoke-Command aby przetestować swój blok skryptu
# Invoke-Command $ScriptBlock
Register-ArgumentCompleter -CommandName Enter-PSSession -ParameterName ComputerName -ScriptBlock $ScriptBlock
uzupełnianie tabulatore - PowerShell

Jak widzisz, podpowiedzi możesz dodawać nie tylko do własnych funkcji, ale także do funkcji z pobranych modułów lub do natywnych cmdletów PowerShell.

To jest świetne! 💪

Podsumowanie

Mam nadzieje, że wpis pozwolił Ci poznać nowy sposób na dodanie podpowiedzi wartości dla parametrów. Stosowanie Register-ArgumentCompleter umożliwi Ci dodanie uzupełnianie tabulatorem wartościami, których potrzebujesz i tam, gdzie ich z normalnie nie ma.

22 Najważniejsze Wskazówki Pisania Skryptów PowerShell

No comments yet.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.

× Close