将ValidateSet与函数或List一起使用



我正在尝试这样做。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.
}

您尝试做的事情有两个方面:

  1. 确保参数验证正确
  2. 使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做了几件事:

  1. 调用其他命令以获取效果列表
  2. 如果传递了$wordToComplete,则查找所有潜在的补全(同时去掉空白并用引号括起来(
  3. 如果未传递$WordToComplete,则将每个潜在的完成项置于引号中

基本上,您只需要更改命令名/变量即可实现此操作。

希望这能帮助

相关内容

  • 没有找到相关文章

最新更新