Используйте ValidateSet с содержимым, загруженным из файла CSV
Мне очень нравится, как работает ValidateSet
. Он предлагает варианты в виде списка при вводе вашего Командлета в PowerShell ISE.
Я хотел бы знать, можно ли извлекать значения из CSV файла (Import-CSV
) и использовать их в блоке Param
, чтобы они стали доступными в раскрывающемся списке PowerShell ISE при создании Командлета аргументы? Немного так же, как $Type
работает сейчас, но затем со значениями из файла импорта.
Function New-Name {
Param (
[parameter(Position=0, Mandatory=$true)]
[ValidateSet('Mailbox','Distribution','Folder','Role')]
[String]$Type,
[parameter(Position=1,Mandatory=$true)]
[String]$Name
)
Process { 'Foo' }
}
Ответы
Ответ 1
Здесь вы можете начать с:
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' }
}
Кредиты, в которых зачисляются кредиты, в основном происходит из статьи от Scripting Guy.
Код не очень хорош, но он делает то, что вы хотите.
![completion]()
Ответ 2
Я предпочитаю модуль TabExpansion ++, хотя это не подтверждается технически, у него есть хорошая функциональность...
Вот пример перегруженной команды msbuild для добавления некоторых проектов intellisense для проектов
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)"
}
}