如何根据上面参数中的输入是或否使参数强制性?

时间:2019-05-01 11:52:40

标签: powershell

我正在创建一个脚本,它将创建新的文本文件。我想问这个人是否要将文件自动上传到Azure存储Blob。 当他们的状态为是时,我想再问2个参数,然后再继续执行脚本。

如何根据输入的是或否使2个参数强制为?

这就是我现在所拥有的,但是显然不起作用。我只是不知道如何在$ Upload_Scripts_To_Azure中将它与Yes或No值一起使用。

   param(
        [parameter(Mandatory = $true)][string]$Remove_Old_Certificate,
        [parameter(Mandatory = $true)][string]$Upload_Scripts_To_Azure,
        [parameter(Mandatory = $true)][string[]]$Servers,
        [parameter(Mandatory = (If ($Upload_Scripts_To_Azure -eq "Yes") 
   {$true 
    } else { $False })][string]$RSG,
    [parameter(Mandatory = (If ($Upload_Scripts_To_Azure -eq "Yes"){$true 
    } else { $False })][string]$AAN
    )

有人可以向我发送正确的方向吗?我已经尝试过ParameterSet,但是它们似乎根本没有输入。

2 个答案:

答案 0 :(得分:0)

您可以使用动态参数“执行”类似的操作:

function test {
    param (
        [parameter(Mandatory = $true)]
        [string]$Remove_Old_Certificate,
        [parameter(Mandatory = $true)]
        [string]$Upload_Scripts_To_Azure,
        [parameter(Mandatory = $true)]
        [string[]]$Servers
    )
    DynamicParam {
        If ($Upload_Scripts_To_Azure -eq "Yes")
        {
            $RSGAttr = [System.Management.Automation.ParameterAttribute]::new()
            $RSGAttr.Mandatory = $true
            $AANAttr = [System.Management.Automation.ParameterAttribute]::new()
            $AANAttr.Mandatory = $true
            $attrCol = new-object System.Collections.ObjectModel.Collection[System.Attribute]
            $attrCol.Add($RSGAttr)
            $RSGParam = [System.Management.Automation.RuntimeDefinedParameter]::new('RSG', [string], $attrCol)
            $attrCol = new-object System.Collections.ObjectModel.Collection[System.Attribute]
            $attrCol.Add($AANAttr)
            $AANParam = [System.Management.Automation.RuntimeDefinedParameter]::new('AAN', [string], $attrCol)
            $ParamsDict = [System.Management.Automation.RuntimeDefinedParameterDictionary]::new()
            $ParamsDict.Add('RSG', $RSGParam)
            $ParamsDict.Add('AAN', $AANParam)
            return $ParamsDict
        }
    }
    Process
    {
        "RSG is $($PSBoundParameters.RSG)"
        "AAN is $($PSBoundParameters.AAN)"
    }
}

这将提示您输入RSG和AAN的值。这些值作为属性存储在$PSBoundParameters中,即$PSBoundParameters.RSG$PSBoundParameters.AAN

运行功能的输出:

> test -Remove_Old_Certificate "SSLCert" -Upload_Scripts_To_Azure "Yes" -Servers "server1","server2"

cmdlet test at command pipeline position 1
Supply values for the following parameters:
RSG: Group1
AAN: Something
RSG is Group1
AAN is Something

> test -Remove_Old_Certificate "SSLCert" -Upload_Scripts_To_Azure "No" -Servers "server1","server2"
RSG is
AAN is

答案 1 :(得分:0)

根据其性质,可以使用参数集。基本上,这是在PowerShell中进行伪“重载”的一种方法。

以下是我可能会考虑的一些重要更改:

Param (
    [Parameter(Mandatory)]
    [String[]]$ComputerName,
    [Parameter(Mandatory)]
    [String]$RemoveCertificate,
    [Parameter(Mandatory,ParameterSetName='Upload')]
    [String]$RSG,
    [Parameter(Mandatory,ParameterSetName='NoUpload')]
    [String]$AAN
)

任何没有ParameterSetName绑定的参数都可用于所有参数集,例如ComputerName和RemoveOldCertificate。然后,仅当其他参数属于同一参数集时才可用。如果您有5个参数集,则可以像这样添加特定的参数以使其对某些子集可用:

    [Parameter(Mandatory,ParameterSetName='SetTwo')]
    [Parameter(Mandatory,ParameterSetName='SetFour')]
    [Parameter(Mandatory,ParameterSetName='SetFive')]
    $Parameter

这完全不需要您的上载参数,但是,如果保留它,则可以将其设为[Switch],而不是[String]

https://docs.microsoft.com/en-us/powershell/developer/cmdlet/cmdlet-parameter-sets