about_Functions_Argument_Completion
Kurze Beschreibung
Die Argumentvollständigung ist ein Feature von PowerShell, das Hinweise bereitstellt, die Ermittlung ermöglicht und die Eingabe von Argumentwerten beschleunigt.
Lange Beschreibung
In diesem Artikel werden die verschiedenen Möglichkeiten beschrieben, wie Sie Argumentvervollständigenr für PowerShell-Funktionen implementieren können. Argument-Vervollständigungsmodule stellen die möglichen Werte für einen Parameter bereit. Die verfügbaren Werte werden zur Laufzeit berechnet, wenn der Benutzer nach dem Parameternamen die TAB-TASTE drückt. Es gibt mehrere Möglichkeiten, einen Argument completer für einen Parameter zu definieren.
Hinweis
Tab ist die Standardtastenbindung unter Windows. Diese Schlüsselbindung kann durch das PSReadLine-Modul oder die Anwendung geändert werden, die PowerShell hosten. Die Schlüsselbindung unterscheidet sich auf Nicht-Windows-Plattformen. Weitere Informationen finden Sie unter about_PSReadLine.
ValidateSet-Attribut
Das ValidateSet-Attribut gibt einen Satz gültiger Werte für einen Parameter oder eine Variable an und ermöglicht die Vervollständigung der Registerkarte. PowerShell generiert einen Fehler, wenn ein Parameter- oder Variablenwert nicht mit einem Wert in der Gruppe übereinstimmt. Im folgenden Beispiel kann der Wert des Fruit-Parameters nur Apfel, Banane oder Birne sein.
Param(
[Parameter(Mandatory=$true)]
[ValidateSet('Apple', 'Banana', 'Pear')]
[string[]]
$Fruit
)
Im folgenden Beispiel muss der Wert der Variablen $flavor
entweder Chocolate, Strawberry oder Vanilla sein. Das ValidateSet
Attribut kann für jede Variable verwendet werden, nicht nur für Parameter.
[ValidateSet('Chocolate', 'Strawberry', 'Vanilla')]
[string]$flavor = 'Strawberry'
Die Überprüfung erfolgt immer dann, wenn diese Variable auch innerhalb des Skripts zugewiesen wird.
Param(
[ValidateSet('hello', 'world')]
[string]$Message
)
$Message = 'bye'
In diesem Beispiel wird zur Laufzeit der folgende Fehler zurückgegeben:
MetadataError: The attribute cannot be added because variable Message with
value bye would no longer be valid.
Weitere Informationen zur Registerkartenerweiterung finden Sie unter about_Tab_Expansion.
Dynamische ValidateSet-Werte mithilfe von Klassen
Sie können eine -Klasse verwenden, um die Werte für ValidateSet zur Laufzeit dynamisch zu generieren. Im folgenden Beispiel werden die gültigen Werte für die Variable $Sound
über eine Klasse namens SoundNames generiert, die drei Dateisystempfade auf verfügbare Sounddateien überprüft:
Class SoundNames : System.Management.Automation.IValidateSetValuesGenerator {
[string[]] GetValidValues() {
$SoundPaths = '/System/Library/Sounds/',
'/Library/Sounds',
'~/Library/Sounds'
$SoundNames = ForEach ($SoundPath in $SoundPaths) {
If (Test-Path $SoundPath) {
(Get-ChildItem $SoundPath).BaseName
}
}
return [string[]] $SoundNames
}
}
Die [SoundNames]
-Klasse wird dann wie folgt als dynamischer ValidateSet-Wert implementiert:
Param(
[ValidateSet([SoundNames])]
[string]$Sound
)
Hinweis
Die IValidateSetValuesGenerator
-Klasse wurde in PowerShell 6.0 eingeführt.
ArgumentCompletions-Attribut
Mit dem ArgumentCompletions-Attribut können Sie einem bestimmten Parameter Tabstopp-Vervollständigungswerte hinzufügen. Ein ArgumentCompletions-Attribut muss für jeden Parameter definiert werden, der die Tabulatorvervollständigung erfordert. Das ArgumentCompletions-Attribut ähnelt ValidateSet. Beide Attribute verwenden eine Liste von Werten, die angezeigt werden sollen, wenn der Benutzer die TAB-TASTE nach dem Parameternamen drückt. Im Gegensatz zu ValidateSet werden die Werte jedoch nicht überprüft und sind eher wie Vorschläge. Daher kann der Benutzer einen beliebigen Wert angeben, nicht nur die Werte in der Liste.
Das ArgumentCompletions-Attribut sollte nicht mit dem ArgumentCompleter-Attribut verwechselt werden, das einen Scriptblock benötigt, um die Optionen zu definieren. Die angegebenen Werte sind verfügbar.
Die Syntax lautet wie folgt:
function Test-ArgumentCompletions {
[CmdletBinding()]
param (
[Parameter(Mandatory=$true)]
[ArgumentCompletions('Fruits', 'Vegetables')]
$Type,
[Parameter()]
[ArgumentCompletions('Apple', 'Banana', 'Orange')]
$Fruit,
[Parameter()]
[ArgumentCompletions('Onion', 'Carrot', 'Lettuce')]
$Vegetable
)
}
Für jeden Parameter wird eine Liste von Optionen für das ArgumentCompletions-Attribut bereitgestellt, um die Tabstoppvervollständigung zu aktivieren.
Dieses Attribut wurde in PowerShell 6.0 eingeführt.
ArgumentCompleter-Attribut
Mit dem ArgumentCompleter-Attribut können Sie einem bestimmten Parameter Tabstopp-Vervollständigungswerte hinzufügen. Ein ArgumentCompleter-Attribut muss für jeden Parameter definiert werden, der eine Tabstopp-Vervollständigung erfordert.
Um ein ArgumentCompleter-Attribut hinzuzufügen, müssen Sie einen Skriptblock definieren, der die Werte bestimmt. Der Skriptblock muss die folgenden Parameter in der unten angegebenen Reihenfolge verwenden. Die Namen des Parameters spielen keine Rolle, da die Werte positionell bereitgestellt werden.
Die Syntax lautet wie folgt:
function MyArgumentCompleter {
Param(
[Parameter(Mandatory)]
[ArgumentCompleter( {
param ( $commandName,
$parameterName,
$wordToComplete,
$commandAst,
$fakeBoundParameters )
# Perform calculation of tab completed values here.
} )]
$ParamName
)
}
ArgumentCompleter-Skriptblock
Die Skriptblockparameter sind auf die folgenden Werte festgelegt:
$commandName
(Position 0): Dieser Parameter ist auf den Namen des Befehls festgelegt, für den der Skriptblock die Tabstoppvervollständigung bereitstellt.$parameterName
(Position 1): Dieser Parameter wird auf den Parameter festgelegt, dessen Wert die Tabulatorvervollständigung erfordert.$wordToComplete
(Position 2): Dieser Parameter ist auf den Wert festgelegt, den der Benutzer vor dem Drücken der TAB-TASTE angegeben hat. Ihr Skriptblock sollte diesen Wert verwenden, um Werte für die Tabstoppabschlussung zu bestimmen.$commandAst
(Position 3): Dieser Parameter wird für die aktuelle Eingabezeile auf die Abstrakte Syntaxstruktur (AST) festgelegt. Weitere Informationen finden Sie in der Dokumentation zum AST-Typ .$fakeBoundParameters
(Position 4): Dieser Parameter wird auf eine Hashtabelle festgelegt, die den$PSBoundParameters
für das Cmdlet enthält, bevor der Benutzer die TAB-TASTE gedrückt hat. Weitere Informationen finden Sie unter about_Automatic_Variables.
Der ArgumentCompleter-Skriptblock muss die Registrierung der Werte mithilfe der Pipeline aufheben, z ForEach-Object
. B. , Where-Object
oder einer anderen geeigneten Methode.
Die Rückgabe eines Arrays von Werten bewirkt, dass PowerShell das gesamte Array als einen Tabstoppabschlusswert behandelt.
Im folgenden Beispiel wird dem Value-Parameter die Vervollständigung der Registerkarte hinzugefügt. Wenn nur der Value-Parameter angegeben wird, werden alle möglichen Werte oder Argumente für Value angezeigt. Wenn der Type-Parameter angegeben ist, zeigt der Value-Parameter nur die möglichen Werte für diesen Typ an.
Darüber hinaus stellt der -like
Operator sicher, dass nur Apple zurückgegeben wird, wenn der Benutzer den folgenden Befehl eingibt und die TAB-Vervollständigung verwendet.
Test-ArgumentCompleter -Type Fruits -Value A
function MyArgumentCompleter{
param ( $commandName,
$parameterName,
$wordToComplete,
$commandAst,
$fakeBoundParameters )
$possibleValues = @{
Fruits = @('Apple', 'Orange', 'Banana')
Vegetables = @('Onion', 'Carrot', 'Lettuce')
}
if ($fakeBoundParameters.ContainsKey('Type')) {
$possibleValues[$fakeBoundParameters.Type] | Where-Object {
$_ -like "$wordToComplete*"
}
} else {
$possibleValues.Values | ForEach-Object {$_}
}
}
function Test-ArgumentCompleter {
[CmdletBinding()]
param (
[Parameter(Mandatory=$true)]
[ValidateSet('Fruits', 'Vegetables')]
$Type,
[Parameter(Mandatory=$true)]
[ArgumentCompleter({ MyArgumentCompleter @args })]
$Value
)
}
Klassenbasierte Argumentvervollständigung
Ab PowerShell 7.2 wurde ein neues Feature hinzugefügt, mit dem Sie generischere Implementierungen parametrisierter Argumentvervollständigenr definieren können.
Durch Ableiten von ArgumentCompleterAttribute
ist es möglich, generische Vervollständigungsmodule zu erstellen, die wiederverwendet werden können, z. B.:
[DirectoryCompleter(ContainingFile="pswh.exe", Depth=2)]
[DateCompleter(WeekDay='Monday', From="LastYear")]
[GitCommits(Branch='release')]
Die abgeleiteten Attribute müssen die IArgumentCompleterFactory
-Schnittstelle implementieren und Eigenschaftenwerte verwenden, um einen spezialisierten Completer zu erstellen.
using namespace System.Collections
using namespace System.Collections.Generic
using namespace System.Management.Automation
using namespace System.Management.Automation.Language
class NumberCompleter : IArgumentCompleter {
[int] $From
[int] $To
[int] $Step
NumberCompleter([int] $from, [int] $to, [int] $step) {
if ($from -gt $to) {
throw [ArgumentOutOfRangeException]::new("from")
}
$this.From = $from
$this.To = $to
$this.Step = $step -lt 1 ? 1 : $step
}
[IEnumerable[CompletionResult]] CompleteArgument(
[string] $CommandName,
[string] $parameterName,
[string] $wordToComplete,
[CommandAst] $commandAst,
[IDictionary] $fakeBoundParameters) {
$resultList = [List[CompletionResult]]::new()
$local:to = $this.To
$local:step = $this.Step
for ($i = $this.From; $i -lt $to; $i += $step) {
$resultList.Add([CompletionResult]::new($i.ToString()))
}
return $resultList
}
}
class NumberCompletionsAttribute : ArgumentCompleterAttribute, IArgumentCompleterFactory {
[int] $From
[int] $To
[int] $Step
NumberCompletionsAttribute([int] $from, [int] $to, [int] $step) {
$this.From = $from
$this.To = $to
$this.Step = $step
}
[IArgumentCompleter] Create() { return [NumberCompleter]::new($this.From, $this.To, $this.Step) }
}
Die Verwendung von PowerShell wäre dann wie folgt:
function Add{
param(
[NumberCompletions(0, 100, 5)]
[int] $X,
[NumberCompletions(0, 100, 5)]
[int] $Y
)
$X + $Y
}
Register-ArgumentCompleter
Das Register-ArgumentCompleter
Cmdlet registriert einen benutzerdefinierten Argumentvervollständigenr.
Mit einem Argument completer können Sie dynamische Tabstopps zur Laufzeit für jeden von Ihnen angegebenen Befehl bereitstellen.
Weitere Informationen finden Sie unter Register-ArgumentCompleter.