Использование ValidateSet () и ValidatePattern (), чтобы разрешить новые значения? - PullRequest
1 голос
/ 13 июня 2019

Я хотел бы написать скрипт с параметром, который имеет существующий набор значений, но также позволяет пользователю вводить неизвестное значение. Я надеюсь, что это позволит завершить табуляцию из известного набора, но не отклонит значение, еще не входящее в известный набор.

В этом случае есть список известных серверов. Может быть добавлен новый сервер, поэтому я хочу разрешить ввод нового имени сервера. Однако 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 Ответ

4 голосов
/ 13 июня 2019

Для этой цели вы можете использовать блок скриптов 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
    )
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...