about_Functions_Argument_Completion
Kısa açıklama
Bağımsız değişken tamamlama, PowerShell'in ipuçları sağlayan, bulmayı etkinleştiren ve bağımsız değişken değerlerinin giriş girişini hızlandıran bir özelliğidir.
Uzun açıklama
Bu makalede, PowerShell işlevleri için bağımsız değişken tamamlayıcıları uygulayabileceğiniz farklı yöntemler açıklanmaktadır. Bağımsız değişken tamamlayıcıları bir parametre için olası değerleri sağlar. Kullanılabilir değerler, kullanıcı parametre adından sonra Sekme tuşuna bastığında çalışma zamanında hesaplanır. Bir parametre için bağımsız değişken tamlayıcı tanımlamanın çeşitli yolları vardır.
Not
Sekme , Windows'ta varsayılan anahtar bağlamadır. Bu anahtar bağlama, PSReadLine modülü veya PowerShell'i barındıran uygulama tarafından değiştirilebilir. Anahtar bağlama, Windows dışı platformlarda farklıdır. Daha fazla bilgi için bkz . about_PSReadLine.
ValidateSet özniteliği
ValidateSet özniteliği, bir parametre veya değişken için bir dizi geçerli değer belirtir ve sekmenin tamamlanmasını sağlar. Bir parametre veya değişken değeri kümedeki bir değerle eşleşmiyorsa PowerShell hata oluşturur. Aşağıdaki örnekte Fruit parametresinin değeri yalnızca Apple, Banana veya Pear olabilir.
Param(
[Parameter(Mandatory=$true)]
[ValidateSet('Apple', 'Banana', 'Pear')]
[string[]]
$Fruit
)
Aşağıdaki örnekte değişkenin $flavor
değeri Chocolate, Strawberry veya Vanilla olmalıdır. ValidateSet
özniteliği yalnızca parametrelerde değil, herhangi bir değişkende kullanılabilir.
[ValidateSet('Chocolate', 'Strawberry', 'Vanilla')]
[string]$flavor = 'Strawberry'
Bu değişken betik içinde bile atandığında doğrulama gerçekleşir.
Param(
[ValidateSet('hello', 'world')]
[string]$Message
)
$Message = 'bye'
Bu örnek çalışma zamanında aşağıdaki hatayı döndürür:
MetadataError: The attribute cannot be added because variable Message with
value bye would no longer be valid.
Sekme genişletme hakkında daha fazla bilgi için bkz . about_Tab_Expansion.
Sınıfları kullanan Dinamik ValidateSet değerleri
Çalışma zamanında ValidateSet değerlerini dinamik olarak oluşturmak için bir Sınıf kullanabilirsiniz. Aşağıdaki örnekte, değişken $Sound
için geçerli değerler, kullanılabilir ses dosyaları için üç dosya sistemi yolunu denetleen SoundNames adlı bir Sınıf aracılığıyla oluşturulur:
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
}
}
Sınıf [SoundNames]
daha sonra aşağıdaki gibi dinamik bir ValidateSet değeri olarak uygulanır:
Param(
[ValidateSet([SoundNames])]
[string]$Sound
)
Not
IValidateSetValuesGenerator
sınıfı PowerShell 6.0'da tanıtıldı.
ArgumentCompletions özniteliği
ArgumentCompletions özniteliği, belirli bir parametreye sekme tamamlama değerleri eklemenize olanak tanır. Sekme tamamlaması gereken her parametre için bir ArgumentCompletions özniteliği tanımlanmalıdır. ArgumentCompletions özniteliği ValidateSet'e benzer. Her iki öznitelik de kullanıcı parametre adından sonra Sekme tuşuna bastığında sunulacak değerlerin listesini alır. Ancak ValidateSet'in aksine, değerler doğrulanmaz ve önerilere benzer. Bu nedenle, kullanıcı yalnızca listedeki değerleri değil herhangi bir değeri sağlayabilir.
ArgumentCompletions özniteliği, seçenekleri tanımlamak için bir betik bloğuna ihtiyaç duyan ArgumentCompleter özniteliğiyle karıştırılmamalıdır. belirtilen değerler kullanılabilir
Söz dizimi şu şekildedir:
function Test-ArgumentCompletions {
[CmdletBinding()]
param (
[Parameter(Mandatory=$true)]
[ArgumentCompletions('Fruits', 'Vegetables')]
$Type,
[Parameter()]
[ArgumentCompletions('Apple', 'Banana', 'Orange')]
$Fruit,
[Parameter()]
[ArgumentCompletions('Onion', 'Carrot', 'Lettuce')]
$Vegetable
)
}
Parametrelerin her birine, sekme tamamlamayı etkinleştirmek için ArgumentCompletions özniteliğine bir seçenek listesi sağlanır.
Bu öznitelik PowerShell 6.0'da kullanıma sunulmuştur.
ArgumentCompleter özniteliği
ArgumentCompleter özniteliği, belirli bir parametreye sekme tamamlama değerleri eklemenize olanak tanır. Sekme tamamlaması gereken her parametre için bir ArgumentCompleter özniteliği tanımlanmalıdır.
ArgumentCompleter özniteliği eklemek için değerleri belirleyen bir betik bloğu tanımlamanız gerekir. Betik bloğu aşağıdaki parametreleri aşağıda belirtilen sırayla almalıdır. Değerler konum olarak sağlandığından parametrenin adları önemli değildir.
Söz dizimi şu şekildedir:
function MyArgumentCompleter {
Param(
[Parameter(Mandatory)]
[ArgumentCompleter( {
param ( $commandName,
$parameterName,
$wordToComplete,
$commandAst,
$fakeBoundParameters )
# Perform calculation of tab completed values here.
} )]
$ParamName
)
}
ArgumentCompleter betik bloğu
Betik bloğu parametreleri aşağıdaki değerlere ayarlanır:
$commandName
(Konum 0) - Bu parametre, betik bloğunun sekme tamamlama sağladığı komutun adına ayarlanır.$parameterName
(Konum 1) - Bu parametre, değeri sekme tamamlama gerektiren parametreye ayarlanır.$wordToComplete
(Konum 2) - Bu parametre, kullanıcının Sekme tuşuna basmadan önce sağladığı değere ayarlanır. Betik bloğunuz sekme tamamlama değerlerini belirlemek için bu değeri kullanmalıdır.$commandAst
(Konum 3) - Bu parametre, geçerli giriş satırı için Soyut Söz Dizimi Ağacı 'na (AST) ayarlanır. Daha fazla bilgi için AST türü belgelerine bakın.$fakeBoundParameters
(Konum 4) - Bu parametre, kullanıcı Sekme tuşuna basmadan önce cmdlet'ini içeren$PSBoundParameters
bir karma tabloya ayarlanır. Daha fazla bilgi için bkz. about_Automatic_Variables.
ArgumentCompleter betik bloğu, , Where-Object
veya başka bir uygun yöntem gibi ForEach-Object
işlem hattını kullanarak değerlerin kaydını kaldırmalıdır.
Bir değer dizisi döndürmek, PowerShell'in tüm diziyi tek sekme tamamlama değeri olarak ele almasına neden olur.
Aşağıdaki örnek, Value parametresine sekme tamamlama ekler. Yalnızca Value parametresi belirtilirse, Value için tüm olası değerler veya bağımsız değişkenler görüntülenir. Tür parametresi belirtildiğinde, Value parametresi yalnızca bu tür için olası değerleri görüntüler.
Buna ek olarak, -like
işleç kullanıcı aşağıdaki komutu yazıp Sekme tamamlama kullanırsa yalnızca Apple'ın döndürülmesini sağlar.
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
)
}
Sınıf tabanlı bağımsız değişken tamlayıcıları
PowerShell 7.2'den başlayarak, parametreli bağımsız değişken tamamlayıcılarının daha genel uygulamalarını tanımlamanıza olanak tanıyan yeni bir özellik eklendi.
'den ArgumentCompleterAttribute
türetilerek, yeniden kullanılabilecek genel tamlayıcılar oluşturmak mümkündür, örneğin:
[DirectoryCompleter(ContainingFile="pswh.exe", Depth=2)]
[DateCompleter(WeekDay='Monday', From="LastYear")]
[GitCommits(Branch='release')]
Türetilen öznitelikler arabirimini IArgumentCompleterFactory
uygulamalı ve özel bir tamlayıcı oluşturmak için özellik değerlerini kullanmalıdır.
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) }
}
PowerShell'den kullanım şu şekilde olacaktır:
function Add{
param(
[NumberCompletions(0, 100, 5)]
[int] $X,
[NumberCompletions(0, 100, 5)]
[int] $Y
)
$X + $Y
}
Register-ArgumentCompleter
cmdlet'i Register-ArgumentCompleter
özel bir bağımsız değişken tamlayıcı kaydeder.
Bağımsız değişken tamamlayıcı, belirttiğiniz herhangi bir komut için çalışma zamanında dinamik sekme tamamlama sağlamanıza olanak tanır.
Daha fazla bilgi için bkz . Register-ArgumentCompleter.
Ayrıca bkz.
PowerShell
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin