【发布时间】:2019-06-13 15:03:19
【问题描述】:
我想编写一个带有参数的脚本,该参数具有一组现有的值,但也允许用户输入未知值。我希望它将允许从已知集合中完成制表符,但不会拒绝尚未在已知集合中的值。
在这种情况下,有一个已知服务器的列表。可能会添加一个新服务器,所以我想允许输入新的服务器名称。但是,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.
【问题讨论】:
-
我认为您需要查看动态参数以从代码生成验证集。
-
这就是参数验证的目的。您可以使用动态参数进行“动态”验证(虽然不确定)。否则,您必须在函数/脚本主体中进行验证。
-
在我的测试中,
ValidateSet不允许指定集合之外的值,即使使用动态参数也是如此。ArgumentCompleter可能会工作,但如果 @lit 有 Powershell 5 或更高版本。
标签: powershell