Use ValidateSet with the contents loaded from a CSV file

前端 未结 2 844
北荒
北荒 2021-02-02 17:54

I really like the way that ValidateSet works. It proposes the options as a list while you type your Cmdlet in the PowerShell ISE.

I would like to know if i

相关标签:
2条回答
  • 2021-02-02 18:15

    I prefer TabExpansion++ module though this doesn't technically validate, it has some nice functionality...

    Here's an example of an msbuild overloaded command to add some intellisense for projects

    Register-ArgumentCompleter -CommandName "msbuild" -ParameterName "target" -ScriptBlock {
        param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameter)
    
        $projectName = $fakeBoundParameter['project']
        $projectFile = Join-Path (Get-Location) $projectName
        $projectXml = [xml](Get-Content $projectFile)
    
        $targets = $projectXml.Project.Target | Where-Object { $_.Name.ToString().StartsWith($wordToComplete) }
        foreach($target in $projectXml.Project.Target)
        {
            New-CompletionResult -CompletionText "$($target.Name)"
        }
    }
    
    0 讨论(0)
  • 2021-02-02 18:20

    Here is something you can start with:

    function New-Name {
        param (
            [parameter(Position=0, Mandatory=$true)]
            [String]$Name
        )
    
        dynamicparam {
            $attributes = new-object System.Management.Automation.ParameterAttribute
            $attributes.ParameterSetName = "__AllParameterSets"
            $attributes.Mandatory = $true
            $attributeCollection = new-object -Type System.Collections.ObjectModel.Collection[System.Attribute]
            $attributeCollection.Add($attributes)
            $values = @('MailBox', 'Tralala', 'Trilili') # your Import-Csv here
            $ValidateSet = new-object System.Management.Automation.ValidateSetAttribute($values)
            $attributeCollection.Add($ValidateSet)
    
            $dynParam1 = new-object -Type System.Management.Automation.RuntimeDefinedParameter("Type", [string], $attributeCollection)
            $paramDictionary = new-object -Type System.Management.Automation.RuntimeDefinedParameterDictionary
            $paramDictionary.Add("Type", $dynParam1)
            return $paramDictionary 
        }
    
         process { 'Foo' }
    }
    

    Credits where credits are due, this largely comes from the following article from the Scripting Guy. The code isn't pretty, but it does what you want.

    completion

    0 讨论(0)
提交回复
热议问题