web-dev-qa-db-ja.com

デフォルト値が表示されたpowershell必須パラメーター

PowerShellスクリプトに必須のパラメーターを要求する方法を探していますが、デフォルト値で表示されます:

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

入力を求めたいが、いくつかのデフォルト値を提供したい。

必須オプションを使用すると、値を適切に要求しますが、デフォルト値を表示したり、指定した値を処理したりしません。必須にしないと、PowerShellは値を要求しません。

私が試したスクリプトの例を次に示します。

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

このスクリプトはパラメーターを要求しますが、最初のパラメーターでEnterキーを押しただけでは、デフォルト値を表示または処理しません。

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

このスクリプトは最初のパラメーターを要求しませんが、デフォルト値を処理します。

10
Alex Flora

これがshortの例です。

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

必須パラメーターとpowershellプロンプトを使用して、必要なことを行う方法はありません。

代わりに、オプションにする(必須を削除する)必要があります。次に、プロンプトコードを自分で実装する必要があります(Read-Hostが、デフォルトとして空白の応答を取ります。そんな感じ)。

3
briantist

定義では、必須パラメーターにはデフォルト値がありません。指定しても、コマンドの呼び出し時に指定されない限り、PowerShellは値の入力を求めます。ただし、求めているものを取得するための「ハッキング」方法があります。変数(およびその結果-パラメーター)には任意の名前を付けることができるため、表示するプロンプトに一致するパラメーターを使用してコマンドを定義するだけで十分です。

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

パラメータなしで呼び出されると、関数はパラメータ名に一致するプロンプトをユーザーに表示します。 -Parameter1 notDefaultValueおよび/または-Parameter2 7で呼び出されると、エイリアスが起動され、選択したパラメーターに渡された値が割り当てられます。そのような名前の変数を扱うのは面白くないので、エイリアス/偽のパラメーター名に一致する変数に値(デフォルトまたはユーザーから渡された値)を割り当てるのは理にかなっています。

3
BartekB