17 votes

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

Je cherche un moyen pour qu'un script PowerShell demande 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 des données mais fournir des valeurs par défaut.

Si j'utilise l'option obligatoire, il demande les valeurs correctement mais ne montre pas la valeur par défaut ou ne traite pas la valeur donnée. Si je n'utilise pas l'option 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 pas ou ne traite pas la valeur par défaut si j'appuie simplement sur la touche entrée du 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.

7voto

Burt_Harris Points 716

Voici un court exemple qui pourrait vous aider :

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

0 votes

Read-Host est presque toujours faux, car il dépend de l'hôte dans lequel le script est exécuté et arrête l'exécution à ce moment-là. Cela ne fonctionnera pas dans les script de connexion, ou tout autre endroit où votre script sera appelé depuis un hôte non interactif.

6voto

BartekB Points 4006

Par définition, les paramètres obligatoires n'ont pas de valeur par défaut. Même si vous en fournissez un, PowerShell vous demandera une valeur à moins qu'elle ne soit spécifiée lors de l'appel de la commande. Il existe toutefois un moyen "détourné" d'obtenir ce que vous demandez. Comme les variables (et par conséquent les paramètres) peuvent porter n'importe quel nom, il suffit de définir une commande dont les paramètres correspondent à l'invite que vous souhaitez voir apparaître :

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ésente à l'utilisateur une invite qui correspond aux noms des paramètres. Lorsqu'elle est appelée avec -Parameter1 notDefaultValue et/ou avec -Parameter2 7 les alias vont intervenir et attribuer une valeur passée au paramètre sélectionné. Comme les variables nommées de la sorte ne sont pas agréables à utiliser, il est logique d'attribuer une valeur (par défaut ou passée par l'utilisateur) à la variable qui correspond à notre alias/ faux nom de paramètre.

3voto

briantist Points 959

Il n'y a pas de 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 (et non obligatoire), puis implémenter vous-même le code d'invite ( Read-Host mais prendre une réponse vide par défaut ; quelque chose comme ça).

3voto

Kolob Canyon Points 1262

Je le ferais de cette façon

param(
    [Parameter(Mandatory)][string]$aString
)

if([string]::IsNullOrWhiteSpace($aString))
{
   $aString = "A Default Value"
}

A mon avis, si vous utilisez Read-Host dans un param() bloquer, alors vous faites quelque chose de mal. À ce moment-là, quel est l'intérêt d'utiliser la fonction param() du tout ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X