使用ValidateSet()和ValidatePattern()允许新值?

时间:2019-06-13 15:03:19

标签: powershell

我想编写一个带有参数的脚本,该参数具有一组现有值,但也允许用户输入未知值。我希望它将允许从已知集中完成制表符补全,但不拒绝已知集中尚未存在的值。

在这种情况下,存在已知服务器的列表。可能添加了新服务器,因此我想允许输入新服务器名称。但是,ValidateSet()会拒绝它不知道的任何内容。

此代码无效。

[cmdletbinding()]
Param (
    [Parameter(Mandatory=$true)]
    [Validatepattern('.*')]
    [ValidateSet('server1', 'server2', 'bazooka')]
    [string]$dbhost
)

Write-Host $dbhost

为已知主机运行此程序效果很好。自动制表符完成功能可与已知主机列表一起使用。但是,新的主机名将被拒绝。

>.\qd.ps1 -dbname server2
server2

>.\qd.ps1 -dbname spock
C:\src\t\qd.ps1 : Cannot validate argument on parameter 'dbname'. The argument "spock" does not belong to the set "server1,server2,bazooka" specified by the
ValidateSet attribute. Supply an argument that is in the set and then try the command again.

1 个答案:

答案 0 :(得分:4)

您可以为此目的使用ArgumentCompleter脚本块。参见https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_functions_advanced_parameters

示例:

function Test-ArgumentCompleter {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [ArgumentCompleter({
            $possibleValues = @('server1', 'server2', 'bazooka')
            return $possibleValues | ForEach-Object { $_ }
        })]
        [String] $DbHost
    )
}