这与我之前问过的一个问题有关。 Group parameter (set?) requiring one of the parameters
我有一组5个参数;年,月,日,路径,输入。我正在寻求组合参数集,以便可以进行以下组合:
年和(路径或输入)
月&(路径或输入)
天数(路径或输入)
Path是类型化路径,而Input是指向文件的指针,无论哪种方式,都需要其中之一。
我试过了
[Parameter(Mandatory = $true, ParameterSetName = 'Path')]
[Parameter(Mandatory = $true, ParameterSetName = 'Input')
[int]$Years = '7'
但是,如果使用Years,则需要输入Path&Input
Param (
[parameter(Position = 0, ValueFromPipeline = $True, ValueFromPipelineByPropertyName = $True)]
[string[]]$Filter = '*.*',
[Parameter(Mandatory = $True, ParameterSetName = 'ByYears')]
[int]$Years = '7',
[Parameter(Mandatory = $True, ParameterSetName = 'ByMonths')]
[int]$Months,
[Parameter(Mandatory = $True, ParameterSetName = 'ByDay')]
[int]$Days,
[Parameter(Mandatory = $true, ParameterSetName = 'Path')]
[string[]]$Path,
[Parameter(Mandatory = $true, ParameterSetName = 'Input')]
[string]$Input,
[switch]$Recurse,
[Parameter(Mandatory = $true)]
[string]$ReportPath = $PWD
)
最后,我希望仅使用以下一种组合;
-2年-路径C:\ Temp
-2年-输入C:\ Temp \ file.txt
-第2个月-路径C:\ Temp
-第二个月-输入C:\ Temp \ file.txt
-第2天-路径C:\ Temp
-第2天-输入C:\ Temp \ file.txt
最佳答案
无法在ParameterSets中直接表达ParameterA and (ParameterB or ParameterC)
,但是您可以创建两个ParameterSets:ParameterA and ParameterB
和ParameterA and ParameterC
,它们具有相同的作用。
如果将其扩展到您的方案,则需要6个ParameterSet:
然后,只需用需要使用的ParameterSet标记每个参数,您的
param
块将变为:function Invoke-Params
{
param(
[parameter(Position = 0, ValueFromPipeline = $True, ValueFromPipelineByPropertyName = $True)]
[string[]]$Filter = '*.*',
[Parameter(Mandatory = $True, ParameterSetName = 'YearsAndPath')]
[Parameter(Mandatory = $True, ParameterSetName = 'YearsAndInput')]
[int]$Years = '7',
[Parameter(Mandatory = $True, ParameterSetName = 'MonthsAndPath')]
[Parameter(Mandatory = $True, ParameterSetName = 'MonthsAndInput')]
[int]$Months,
[Parameter(Mandatory = $True, ParameterSetName = 'DaysAndPath')]
[Parameter(Mandatory = $True, ParameterSetName = 'DaysAndInput')]
[int]$Days,
[Parameter(Mandatory = $true, ParameterSetName = 'YearsAndPath')]
[Parameter(Mandatory = $true, ParameterSetName = 'MonthsAndPath')]
[Parameter(Mandatory = $true, ParameterSetName = 'DaysAndPath')]
[string[]]$Path,
[Parameter(Mandatory = $true, ParameterSetName = 'YearsAndInput')]
[Parameter(Mandatory = $true, ParameterSetName = 'MonthsAndInput')]
[Parameter(Mandatory = $true, ParameterSetName = 'DaysAndInput')]
[string]$Input,
[switch]$Recurse,
[Parameter(Mandatory = $true)]
[string]$ReportPath = $PWD
)
}
然后以下工作正常:
PS> Invoke-Params -Years 5 -Path "xxx"
PS> Invoke-Params -Years 5 -Input "xxx"
这些抛出异常:
PS> Invoke-Params -Years 5
Invoke-Params : Parameter set cannot be resolved using the specified named parameters.
At line:1 char:1
+ Invoke-Params -Years 5
+ ~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Invoke-Params], ParameterBindingException
+ FullyQualifiedErrorId : AmbiguousParameterSet,Invoke-Params
PS> Invoke-Params -Years 5 -Path "aaa" -Input "bbb"
Invoke-Params : Parameter set cannot be resolved using the specified named parameters.
At line:1 char:1
+ Invoke-Params -Years 5 -Path "aaa" -Input "bbb"
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Invoke-Params], ParameterBindingException
+ FullyQualifiedErrorId : AmbiguousParameterSet,Invoke-Params
关于powershell - 组合参数集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58772259/