我正在尝试这样做。GetSomeOtherParameter返回一个系统。数据库中的数组类型列表。
我不想硬编码我的ValidateSet,以防数据库中的列表随时间变化
function Get-SomeItems {
param (
[Parameter(Mandatory = $true)]
[ValidateSet(Get-SomeOtherParameter)]
[string]$filter,
[Parameter(Mandatory = $true)]
[ValidateSet('abc', 'def', 'ghi')]
[String]$filter2
)
}
通过拼写[ValidateScript({ ... }]
和[ArgumentCompleter({ ... })
方法来补充Start Automating的有用答案:
# Function that returns the valid values for the -filter parameter below.
function Get-ValidFilterValues {
# Sample, hard-coded values. This is where your database lookup would happen.
'foo', 'bar'
}
function Get-SomeItems {
param (
[Parameter(Mandatory)]
[ValidateScript({
$validValues = Get-ValidFilterValues
if ($_ -in $validValues) { return $true } # OK
throw "'$_' is not a valid value. Use one of the following: '$($validValues -join ', ')'"
})]
[ArgumentCompleter({
param($cmd, $param, $wordToComplete)
(Get-ValidFilterValues) -like "$wordToComplete*"
})]
[string]$filter,
[Parameter(Mandatory)]
[ValidateSet('abc', 'def', 'ghi')]
[String]$filter2
)
$filter, $filter2 # sample output.
}
更简单的PowerShell(Core(7+替代方案是通过实现System.Management.Automation.IValidateSetValuesGenerator
接口的自定义class
实现验证,该接口还自动提供选项卡完成:
# Custom class that implements the IValidateSetValuesGenerator interface
# in order to return the valid values for the -filter parameter below.
class ValidFilterValues : System.Management.Automation.IValidateSetValuesGenerator {
[string[]] GetValidValues() {
# Sample, hard-coded values. This is where your database lookup would happen.
return 'foo', 'bar'
}
}
function Get-SomeItems {
param (
[Parameter(Mandatory)]
[ValidateSet([ValidFilterValues])] # Pass the custom class defined above.
[string]$filter,
[Parameter(Mandatory)]
[ValidateSet('abc', 'def', 'ghi')]
[String]$filter2
)
$filter, $filter2 # sample output.
}
您尝试做的事情有两个方面:
- 确保参数验证正确
- 使PowerShell体验围绕它";"好";(又称支撑标签完成(
参数验证:
您可能已经注意到[ValidateSet]是一个硬编码列表。软编码是不可能的(每次使用其他模块动态构建脚本是可能的,让我知道你是否需要更多的解释(。
为了使验证在没有[ValidateSet]
的情况下工作,我建议使用[ValidateScript({})]
。[ValidateScript]
将运行ValidateScript中的任何脚本,以确保脚本有效。如果[ValidateScript((]抛出,则用户在.中传递无效值时会看到该消息
选项卡完成:
为了让它感觉简单,您还需要添加对制表符完成的支持。
使用[ArgumentCompleter]
属性非常简单。
下面是一个从名为LightScript 的模块复制/粘贴的示例
[ArgumentCompleter({
param ( $commandName,
$parameterName,
$wordToComplete,
$commandAst,
$fakeBoundParameters )
$effectNames = @(Get-NanoLeaf -ListEffectName |
Select-Object -Unique)
if ($wordToComplete) {
$toComplete = $wordToComplete -replace "^'" -replace "'$"
return @($effectNames -like "$toComplete*" -replace '^', "'" -replace '$',"'")
} else {
return @($effectNames -replace '^', "'" -replace '$',"'")
}
})]
这个ArgumentCompleter做了几件事:
- 调用其他命令以获取效果列表
- 如果传递了$wordToComplete,则查找所有潜在的补全(同时去掉空白并用引号括起来(
- 如果未传递$WordToComplete,则将每个潜在的完成项置于引号中
基本上,您只需要更改命令名/变量即可实现此操作。
希望这能帮助