parâmetro obrigatório powershell com o valor por omissão mostrado

Estou à procura de uma forma de ter um script PowerShell pedir um parâmetro que precisa ser obrigatório, mas mostrado com um valor padrão, por exemplo:

    .\psscript
    Supply values for the following parameters:
    parameter1[default value]:
    parameter2[1234]:

quero pedir dados de entrada, mas fornecer alguns valores predefinidos.

Se eu usar a opção obrigatória, ela pede os valores gentilmente, mas não mostra o valor padrão ou processa o valor indicado. Se não o tornar obrigatório, a PowerShell não pede o valor.

Aqui estão alguns exemplos de scripts I tentei.
    [CmdletBinding()]
    Param(
        [parameter(Mandatory=$true)] $SqlServiceAccount = $env:computername + "_sa",
        [parameter(Mandatory=$true)] $SqlServiceAccountPwd
    )

Este programa pede parâmetros mas não mostra nem processa o valor por omissão se carregar em enter no primeiro parâmetro.

    [CmdletBinding()]
    Param(
        [parameter(Mandatory=$false)] $SqlServiceAccount = $env:computername + "_sa",
        [parameter(Mandatory=$true)] $SqlServiceAccountPwd
    )

Este script não pede o primeiro parâmetro, mas processa o valor padrão.

Author: alex, 2016-10-05

3 answers

Aqui está um pequeno exemplo que pode ajudar.
    [CmdletBinding()]
    Param(
        $SqlServiceAccount = (Read-Host -prompt "SqlServiceAccount ($($env:computername + "_sa"))"),
        $SqlServiceAccountPwd = (Read-Host -prompt "SqlServiceAccountPwd")
    )
    if (!$SqlServiceAccount) { $SqlServiceAccount = $env:Computername + "_sa" }
    ...
 2
Author: Burt_Harris, 2016-10-05 18:19:55

Não há uma maneira de fazer o que você quer com um parâmetro obrigatório e powershell pedindo para você.

Em vez disso, teria de torná-lo opcional (remover o obrigatório), e depois implementar o código de sugestão você mesmo ({[[0]}, mas tome a resposta em branco como um padrão; algo do género).

 2
Author: briantist, 2016-10-05 15:44:13

Por definição: os parâmetros obrigatórios não têm valores por defeito. Mesmo se você fornecer um, PowerShell irá pedir o valor, a menos que especificado quando o comando é chamado. Há, no entanto, uma maneira "hacky" de obter o que você pede. Como as variáveis (e como consequência - parâmetros) podem ter qualquer nome que desejar, é suficiente definir um comando com parâmetros que correspondam à linha de comandos que deseja ver:

function foo {
    param (
        [Parameter(Mandatory = $true)]
        [Alias('Parameter1')]
        [AllowNull()]
        ${Parameter1[default value]},
        [Parameter(Mandatory = $true)]
        [Alias('Parameter2')]
        [AllowNull()]
        ${Parameter2[1234]}
    )
    $Parameter1 = 
        if (${Parameter1[default value]}) {
            ${Parameter1[default value]}
        } else {
            'default value'
        }
    $Parameter2 = 
        if (${Parameter2[1234]}) {
            ${Parameter2[1234]}
        } else {
            1234
        }
    [PSCustomObject]@{
        Parameter1 = $Parameter1
        Parameter2 = $Parameter2
    }
}

Quando os parâmetros W/o são chamados, a função irá apresentar ao utilizador a resposta que corresponder nomes dos parâmetros. Quando chamado com -Parameter1 notDefaultValue e / ou com -Parameter2 7, os nomes alternativos irão ligar-se e atribuir valor passado ao parâmetro seleccionado. Como variáveis com esse nome não são divertidas de trabalhar - faz sentido atribuir valor (por omissão ou passado pelo utilizador) a uma variável que corresponda ao nosso nome de parâmetro alias/ falsos.

 1
Author: BartekB, 2016-10-05 17:37:42