我正在创建一个脚本,它将创建新的文本文件。我想问这个人是否要将文件自动上传到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,但是它们似乎根本没有输入。
答案 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