web-dev-qa-db-fra.com

paramètre obligatoire powershell avec la valeur par défaut affichée

Je cherche un moyen de demander à un script PowerShell de demander un paramètre qui doit être obligatoire, mais affiché avec une valeur par défaut, par exemple:

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

Je veux demander une entrée mais donner quelques valeurs par défaut.

Si j'utilise l'option obligatoire, les valeurs sont bien demandées mais ne montre pas la valeur par défaut ou ne traite pas la valeur donnée. Si je ne le rend pas obligatoire, PowerShell ne demande pas la valeur du tout.

Voici quelques exemples de script que j'ai essayés:

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

Ce script demande des paramètres mais ne montre ni ne traite la valeur par défaut si j'appuie simplement sur entrée sur le premier paramètre.

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

Ce script ne demande pas le premier paramètre, mais traite la valeur par défaut.

7
Alex Flora

Voici un short exemple qui pourrait aider: 

    [CmdletBinding()]
    Param(
        $SqlServiceAccount = (Read-Host -Prompt "SqlServiceAccount ($($env:computername + "_sa"))"),
        $SqlServiceAccountPwd = (Read-Host -Prompt "SqlServiceAccountPwd")
    )
    if (!$SqlServiceAccount) { $SqlServiceAccount = $env:Computername + "_sa" }
    ...
5
Burt_Harris

Il n'y a pas moyen de faire ce que vous voulez avec un paramètre obligatoire et une invite PowerShell pour vous.

Vous devriez plutôt le rendre facultatif (supprimer obligatoire), puis implémenter le code d'invite vous-même (Read-Host, mais prenez une réponse vide par défaut; quelque chose comme ça).

3
briantist

Par définition, les paramètres obligatoires n'ont pas de valeurs par défaut. Même si vous en fournissez un, PowerShell demandera une valeur, sauf indication contraire lors de l'appel de la commande. Cependant, il existe un moyen "hacky" d'obtenir ce que vous demandez. Comme les variables (et en tant que conséquence - paramètres) peuvent avoir n'importe quel nom, il suffit de définir une commande avec des paramètres qui correspondent à l'invite que vous souhaitez voir:

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
    }
}

Lorsqu'elle est appelée sans paramètres, la fonction présentera à l'utilisateur une invite correspondant aux noms de paramètres. Lorsqu'ils sont appelés avec -Parameter1 notDefaultValue et/ou avec -Parameter2 7, les alias entrent en jeu et attribuent la valeur transmise au paramètre sélectionné. Comme les variables nommées ainsi ne sont pas amusantes, il est logique d’attribuer une valeur (par défaut ou passée par l’utilisateur) à une variable qui correspond à notre nom de paramètre alias/fake.

2
BartekB