Powershell Динамические условные параметры - PullRequest
0 голосов
/ 25 марта 2019

Я пишу скрипт и хочу указать параметры для следующих действий:

Параметр 1 - действие (проверка или уничтожение) Параметр 2 является компьютерным именем.

Если ни один из параметров не указан, я хочу, чтобы отображалась информация об использовании Параметр 2 следует запрашивать ТОЛЬКО, если указан параметр 1.

Param(
    [Parameter(Mandatory=$True,
    HelpMessage="Please Enter an Action. (C)heck, (K)ill, or (?) for usage")]
    [String]$Action,

    [Parameter(Mandatory = $false,
    Helpmessage="Please Enter One or More Hostnames. seperate multiple hostnames with an , EXAMPLE: Hostname1,Hostname2")]
    [ValidateNotNullorEmpty()]
    [String]$Computers 
    )

Ответы [ 2 ]

1 голос
/ 26 марта 2019

Зачем заставлять пользователей догадываться, какой вход ожидается?Просто скажите им заранее, что ожидается.

Например:

Function Test-DescriptiveUserPrompt
{
    [CmdletBinding()]

    Param
    (
        [ValidateSet('C','K')]
        [string]$Action = $(
        Write-Host '
        Please Enter an Action. (C)heck, (K)ill:   ' -ForegroundColor Yellow -NoNewLine
        Read-Host 
            ),

        [ValidateNotNullorEmpty()]
        [string[]]$Computers = $(
        Write-Host '
        Please Enter One or More Hostnames. separate multiple hostnames with a comma. 
        EXAMPLE: Hostname1,Hostname2:   ' -ForegroundColor Yellow -NoNewLine
        Read-Host 
        )
    )

    Process
    {
            "You choose $Action"
            "You enter the list $Computers"
    }
}


# Results

Test-DescriptiveUserPrompt

        Please Enter an Action. (C)heck, (K)ill:   c

        Please Enter One or More Hostnames. seperate multiple hostnames with a comma. 
        EXAMPLE: Hostname1,Hostname2:   localhost,remotehost
c
localhost,remotehost


Test-DescriptiveUserPrompt -Action C -Computers localhost,remotehost

C
localhost
remotehost
0 голосов
/ 25 марта 2019

Быстрый, грязный и простой способ сделать это - использовать наборы параметров.В этом случае по умолчанию будет отображаться информация об использовании, если что-то не так.

Function Test {
    [CmdletBinding()]
Param(
    [Parameter(Mandatory=$true, ParameterSetName = "Action",
    HelpMessage="Please Enter an Action. (C)heck, (K)ill, or (?) for usage")]
    [ValidateSet("C","K","?")]
    [Parameter(Mandatory=$false, ParameterSetName = "Usage")]
    [String]$Action,

    [Parameter(Mandatory = $true, ParameterSetName = "Action",
    Helpmessage="Please Enter One or More Hostnames. seperate multiple hostnames with an , EXAMPLE: Hostname1,Hostname2")]
    [ValidateNotNullorEmpty()]
    [String]$Computers 
    )
Process
{
    if($PSCmdlet.ParameterSetName -eq "Usage" -or $Action -eq "?")
    {
        Write-Host "Usage"
    }
    else
    {
        Write-Host "Action"
        Write-Host $Action
        Write-Host $Computers
    }
}
}
...