Use ValidateSet with the contents loaded from a CSV file
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.
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)" }}