0

当一个脚本的签名被一个参数(单独地)区分时,参数集对我来说是有意义的。

例子:

.\myscript.ps1 -InputFile [-Optional1] [-Optional2]...
.\myscript.ps1 -ArrayOfNames [-Optional1] [-Optional2]...

我的问题是:当您希望支持并行(或多个)依赖项时,参数集是否是逻辑选择,如下所述?

这是我目前的情况。我正在添加对查询包含时间戳的日志的现有脚本的支持。该脚本应接受 csv 文件smtp 地址数组,以识别要查询的用户。

该脚本还应支持开始和结束日期参数整数值,以方便报告从当前日期计算的过去 n 天。

我希望支持的结果是:

.\myScript -InputFile -StartDate -EndDate [-Optional1] [-Optional2]...
.\myScript -InputFile -LastNumDays [-Optional1] [-Optional2]...
.\myScript -Smtp -StartDate -EndDate [-Optional1] [-Optional2]...
.\myScript -Smtp -LastNumDays [-Optional1] [-Optional2]...

如果我不尝试结合我的两个要求,以下两个参数定义中的任何一个都可以正常工作:

[Parameter(Mandatory=$true, ParameterSetName="Input")]
[ValidateScript({Test-Path -Path $_ -PathType Leaf})][string] $InputFile,

[Parameter(Mandatory=$true, ParameterSetName="NoInput")]
[ValidateNotNullOrEmpty()][String[]] $Smtp

Get-Help 将预期使用情况显示为:

.\myScript.ps1 -InputFile <String> [<CommonParameters>]
.\myScript.ps1 -Smtp <String[]> [<CommonParameters>]

如果我改为配置以下内容:

[Parameter(Mandatory=$true, ParameterSetName="NotRange")]
[ValidateNotNullOrEmpty()][int] $LastNumDays = 30, # init 30 days default

[Parameter(Mandatory=$true, ParameterSetName="Range")]
[ValidateNotNullOrEmpty()][Alias("Start")] [DateTime] $StartDate,

[Parameter(Mandatory=$true, ParameterSetName="Range")]
[ValidateNotNullOrEmpty()][Alias("End")] [DateTime] $EndDate

Get-Help 将预期使用情况显示为:

.\myScript.ps1 -LastNumDays <Int32> [<CommonParameters>]
.\myScript.ps1 -StartDate <DateTime> -EndDate <DateTime> [<CommonParameters>]

问题是我似乎无法像本文开头所述的那样合并我的依赖项。我使用参数集组合这两个逻辑依赖项的失败尝试之一示例如下:

[Parameter(Mandatory=$true, ParameterSetName="Input")]
[ValidateScript({Test-Path -Path $_ -PathType Leaf})][string] $InputFile,

[Parameter(Mandatory=$true, ParameterSetName="NoInput")]
[ValidateNotNullOrEmpty()][String[]] $Smtp,

[Parameter(Mandatory=$true, ParameterSetName="NotRange")]
[Parameter(Mandatory=$true, ParameterSetName="Input")]
[Parameter(Mandatory=$true, ParameterSetName="NoInput")]
[ValidateNotNullOrEmpty()][int] $LastNumDays = 30, # init 30 days default

[Parameter(Mandatory=$true, ParameterSetName="Range")]
[Parameter(Mandatory=$true, ParameterSetName="Input")]
[Parameter(Mandatory=$true, ParameterSetName="NoInput")]
[ValidateNotNullOrEmpty()][Alias("Start")] [DateTime] $StartDate,

[Parameter(Mandatory=$true, ParameterSetName="Range")]
[Parameter(Mandatory=$true, ParameterSetName="Input")]
[Parameter(Mandatory=$true, ParameterSetName="NoInput")]
[ValidateNotNullOrEmpty()][Alias("End")] [DateTime] $EndDate

Get-Help 结果不正确 b/c 前两个用法语句允许同时使用 LastNumDays 和 Start/EndDate 参数:

.\myScript.ps1 -InputFile <String> -LastNumDays <Int32> -StartDate <DateTime> -EndDate <DateTime> [<CommonParameters>]

.\myScript.ps1 -Smtp <String[]> -LastNumDays <Int32> -StartDate <DateTime> -EndDate <DateTime> [<CommonParameters>]

.\myScript.ps1 -LastNumDays <Int32> [<CommonParameters>]
.\myScript.ps1 -StartDate <DateTime> -EndDate <DateTime> [<CommonParameters>]

我已经测试了强制真/假的不同组合,包括/省略了我的命名参数集,但没有成功。

我现在怀疑我的要求可能不适合用于支持的用例参数集,但我想知道我应该使用什么模式和实践。

如果不使用参数集,如何正确定义这两个依赖项的使用语法?我觉得我必须避免在我的代码中使用测试来宣布未在 Get-Help 中定义的依赖项。

谢谢!

4

1 回答 1

0

您需要使每个参数集都是唯一的,以便 PowerShell 可以将它们区分开来。为简单起见,我将参数集命名为 A 到 D:

甲:-InputFile -StartDate -EndDate
乙:-InputFile -LastNumDays
丙:-Smtp -StartDate -EndDate
丁:-Smtp -LastNumDays

现在将每个参数与它出现的每个参数集相关联:

Param(
  [Parameter(Mandatory=$true, ParameterSetName="A")]
  [Parameter(Mandatory=$true, ParameterSetName="B")]
  [string]$InputFile,

  [Parameter(Mandatory=$true, ParameterSetName="C")]
  [Parameter(Mandatory=$true, ParameterSetName="D")]
  [String[]]$Smtp,

  [Parameter(Mandatory=$true, ParameterSetName="B")]
  [Parameter(Mandatory=$true, ParameterSetName="D")]
  [int]$LastNumDays,

  [Parameter(Mandatory=$true, ParameterSetName="A")]
  [Parameter(Mandatory=$true, ParameterSetName="C")]
  [DateTime]$StartDate,

  [Parameter(Mandatory=$true, ParameterSetName="A")]
  [Parameter(Mandatory=$true, ParameterSetName="C")]
  [DateTime]$EndDate
)

输出:

PS C:\> .\test.ps1 -?
test.ps1 -InputFile <string> -LastNumDays <int> [<CommonParameters>]
test.ps1 -InputFile <string> -StartDate <datetime> -EndDate <datetime> [<CommonParameters>]
test.ps1 -Smtp <string[]> -LastNumDays <int> [<CommonParameters>]
test.ps1 -Smtp <string[]> -StartDate <datetime> -EndDate <datetime> [<CommonParameters>]

请注意,为强制参数 ( -LastNumDays) 提供默认值是没有意义的,因为无论如何您都需要提供一个值。

于 2016-10-10T16:45:24.863 回答