powershell - 组合参数集

标签 powershell parameters

这与我之前问过的一个问题有关。 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 ParameterBParameterA and ParameterC,它们具有相同的作用。

如果将其扩展到您的方案,则需要6个ParameterSet:

  • YearsAndPath
  • YearsAndInput
  • MonthsAndPath
  • MonthsAndInput
  • DaysAndPath
  • DaysAndInput

  • 然后,只需用需要使用的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/

    相关文章:

    powershell - 在Powershell中的ForEach-Object中引用目标对象

    powershell - 使用 powershell 检索用户配置文件的大小

    class - Powershell:创建类

    powershell - 使用 System.IO.FileSystemWatcher 后使用 Powershell 循环文件

    c - 在 C 函数中需要 "nmem"和 "size"参数吗?

    java - 将参数传递给 Jasper Reports 时出现的问题

    powershell - 在程序文件中使用 exe 调用表达式

    types - 我可以传入一个 "Type"作为函数参数吗?

    c++ - 模板实参作为模板参数传给另一个模板时,为什么推导不出来?

    ruby-on-rails - 如果我们将参数缓存到操作中的本地变量中,它会有所帮助还是相同?