powershell必需参数,默认值为

时间:2016-10-05 15:33:08

标签: powershell parameters

我正在寻找一种方法让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
    )

此脚本不会要求第一个参数,但会处理默认值。

4 个答案:

答案 0 :(得分:5)

这是一个可能有用的简短示例:

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

答案 1 :(得分:3)

没有办法通过强制参数和powershell提示你做你想做的事。

您必须将其设为可选(删除必填),然后自行实施提示代码(Read-Host,但默认采用空白响应;类似的事情。)

答案 2 :(得分:3)

根据定义:强制参数没有默认值。即使您提供了一个,PowerShell也会提示输入值,除非在调用该命令时指定。然而,有一种'hacky'方式可以满足您的要求。由于变量(以及结果 - 参数)可以包含您希望的任何名称,因此使用与您希望看到的提示相匹配的参数来定义命令就足够了:

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

当调用w / o参数时,函数将向用户显示匹配参数名称的提示。使用-Parameter1 notDefaultValue和/或-Parameter2 7调用时,别名将启动并将传递的值分配给所选参数。由于这样的变量没有任何乐趣 - 将值(默认值或由用户传递)赋给与我们的别名/伪参数名称匹配的变量是有意义的。

答案 3 :(得分:1)

我会这样做

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

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

我认为,如果您在Read-Host块中使用param(),那么您做错了什么。那时,完全使用param()有什么意义?