2015-06-18 2 views
2

Как добавить вкладку динамических аргументов в командлет PowerShell?Добавить пользовательский аргумент завершен для Cmdlet?

Когда я набираю это и нажимаю tab, я бы хотел, чтобы он выполнил вкладку.

PM> Paket-Add -NuGet FSharp.Co 

Эти ценности я хотел бы использовать в этом примере:

PM> Paket-FindPackages -SearchText FSharp.Co 
FSharp.Core 
FSharp.Core.3 
FSharp.Configuration 
FSharp.Core.Fluent-3.1 
FSharp.Core.Fluent-4.0 
FSharp.Compiler.Tools 
FSharp.Compatibility.Scala 
FSharp.Compatibility.OCaml 
FSharp.Compiler.CodeDom 
FSharp.Compiler.Service 
FSharp.Control.Reactive 
FSharp.Compatibility.Haskell 
FSharp.Compatibility.OCaml.Numerics 
FSharp.Compatibility.OCaml.Format 
FSharp.Compatibility.OCaml.System 
FSharp.Collections.ParallelSeq 
FSharp.Compatibility.StandardML 
FSharp.Compatibility.OCaml.LexYacc 
FSharp.Control.AsyncSeq 

я нашел this answer, который дал несколько полезных ссылок и сказал, что я должен работать Get-Content function:TabExpansion2:

enter image description here

Похоже, что CommandCompletion.CompleteInput необходимо реализовать. Мне показалось, что я где-то читал, что есть функции для функций для команд Hashtable. Если да, то где это и как установить пользовательские? Я использую Chocolatey для распространения Paket.PowerShell. Вот Cmdlet code.

UPDATE 2015-06-20:

Я в конечном итоге заставить его работать с кодом здесь: https://github.com/fsprojects/Paket/blob/76de1c44853ce09029ba157855525f435d951b85/src/Paket.PowerShell/ArgumentTabCompletion.ps1

# https://github.com/mariuszwojcik/RabbitMQTools/blob/master/TabExpansions.ps1 
function createCompletionResult([string]$text, [string]$value, [string]$tooltip) { 
    if ([string]::IsNullOrEmpty($value)) { return } 
    if ([string]::IsNullOrEmpty($text)) { $text = $value } 
    if ([string]::IsNullOrEmpty($tooltip)) { $tooltip = $value } 
    $completionText = @{$true="'$value'"; $false=$value }[$value -match "\W"] 
    $completionText = $completionText -replace '\[', '``[' -replace '\]', '``]' 
    New-Object System.Management.Automation.CompletionResult $completionText, $text, 'ParameterValue', $tooltip | write 
} 

$findPackages = { 
    param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameter) 
    Paket-FindPackages -SearchText $wordToComplete -Max 100 | % { 
     createCompletionResult $_ $_ $_ | write 
    } 
} 

$findPackageVersions = { 
    param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameter) 
    if (-not $fakeBoundParameter.NuGet){ return } 
    Paket-FindPackageVersions -Name $fakeBoundParameter.NuGet -Max 100 | % { 
     createCompletionResult $_ $_ $_ | write 
    } 
} 

# create and add $global:options to the list of completers 
# http://www.powertheshell.com/dynamicargumentcompletion/ 
if (-not $global:options) { $global:options = @{CustomArgumentCompleters = @{};NativeArgumentCompleters = @{}}} 

$global:options['CustomArgumentCompleters']['Paket-Add:NuGet'] = $findPackages 
$global:options['CustomArgumentCompleters']['Paket-Add:Version'] = $findPackageVersions 

$function:tabexpansion2 = $function:tabexpansion2 -replace 'End\r\n{','End { if ($null -ne $options) { $options += $global:options} else {$options = $global:options}' 

Completer имена Param важны. Переименование их сделает его неработоспособным.

+0

Другой важный кусок был имеющий этот скрипт запускается при загрузке модуля. Это было сделано, добавив это в .psd1: 'ScriptsToProcess = 'ArgumentTabCompletion.ps1'' –

ответ

1

Возможно, вы захотите взглянуть на TabExpansion++ module, который был разработан, чтобы облегчить расширение вкладок.

Я просто играл с ним в течение нескольких минут, и я думаю, что вы хотите что-то подобное на примере:

Import-Module TabExpansion++ 

function PaketAddNugetCompletion 
{ 
    [ArgumentCompleter(Parameter = 'Nuget', Command = 'Paket-Add')] 
    param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameter) 

    Paket-FindPackages -SearchText $wordToComplete | 
     ForEach-Object { 
      # not quite sure what property to use off the result, but this might work. 
      New-CompletionResult -CompletionText $_ 
     } 
} 
+0

Я разместил мое решение выше. Я отмечаю это как ответ, так как это привело меня к такому решению. –

1

Это называется Dynamic parameters and are described in about_Functions_Advanced_Parameters.

В следующем примере показана функция образца со стандартными параметрами имени Имя и путь, и дополнительный динамический параметр именованный параметр DP1.The DP1 находится в наборе параметров PSet1 и имеет тип Int32. Параметр DP1 доступен в функции Sample , только если значение параметра Path содержит «HKLM:», указывая , что оно используется в драйвере реестра HKEY_LOCAL_MACHINE.

function Get-Sample { 
    [CmdletBinding()] 
    Param ([String]$Name, [String]$Path) 

    DynamicParam 
    { 
     if ($path -match ".*HKLM.*:") 
     { 
      $attributes = new-object System.Management.Automation.ParameterAttribute 
      $attributes.ParameterSetName = "__AllParameterSets" 
      $attributes.Mandatory = $false 
      $attributeCollection = new-object -Type System.Collections.ObjectModel.Collection[System.Attribute] 
      $attributeCollection.Add($attributes) 

      $dynParam1 = new-object -Type System.Management.Automation.RuntimeDefinedParameter("dp1", [Int32], $attributeCollection) 

      $paramDictionary = new-object -Type System.Management.Automation.RuntimeDefinedParameterDictionary 
      $paramDictionary.Add("dp1", $dynParam1) 
      return $paramDictionary 
     } 
    } 
} 

Here's another example that does validation sets dynamically.


Я перечитал свой вопрос, и он выглядит, может быть, вы просто хотите статический, предопределенный список табуляции завершения значений для конкретного параметра. Если это так, то вы можете просто use the [ValidateSet()] attribute:

function Get-Something { 
[CmdletBinding()] 
param(
    [ValidateSet('One','Two','Three')] 
    [String] 
    $MyParam 
) 
} 

Но если значения должны быть определены во время выполнения, тогда смотрите выше раздел динамических параметров вместо этого.