【问题标题】:powershell mandatory parameter with default value shown显示默认值的 powershell 强制参数
【发布时间】:2020-11-10 02:35:41
【问题描述】:

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

如果我只是在第一个参数上按回车,此脚本会询问参数,但不会显示或处理默认值。

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

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

【问题讨论】:

    标签: powershell parameters


    【解决方案1】:

    这是一个简短的示例,可能会有所帮助:

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

    【讨论】:

    • Read-Host 几乎总是错误的,因为它取决于运行脚本的主机并在该点停止执行。这不适用于登录脚本,或您的脚本将从非交互式主机调用的任何其他位置。
    【解决方案2】:

    根据定义:强制参数没有默认值。即使您提供了一个,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
        }
    }
    

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

    【讨论】:

      【解决方案3】:

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

      您必须将其设为可选(删除强制),然后自己实现提示代码(Read-Host,但默认为空白响应;类似的东西)。

      【讨论】:

        【解决方案4】:

        我会这样做

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-12-11
          • 2014-03-19
          • 2011-08-29
          • 2013-03-05
          • 2020-03-07
          • 1970-01-01
          • 2017-01-08
          • 2015-08-17
          相关资源
          最近更新 更多