Использование наборов параметров для ограничения нескольких взаимоисключающих зависимостей
Когда сигнатура скрипта дифференцируется (по отдельности) аргументом, наборы параметров имеют смысл для меня.
Пример:
.\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 неверны, поскольку первые два оператора использования позволяют использовать параметры 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>]
Я проверил различные комбинации обязательных значений true/false и, в том числе, / пропустил мои именованные наборы параметров, но безуспешно
Теперь я подозреваю, что мои требования могут не подходить для наборов параметров варианта использования, предназначенных для поддержки, но мне остается только задуматься, какой шаблон и практику я должен использовать вместо этого.
Как правильно определить синтаксис использования этих двух зависимостей, если не используются наборы параметров? Я чувствую, что должен избегать использования тестов в моем коде, которые объявляют зависимости, которые не определены в Get-Help.
Спасибо!
1 ответ
Необходимо сделать каждый набор параметров уникальным, чтобы PowerShell мог отличить один от другого. Для простоты я назову наборы параметров от A до D:
A: -InputFile -StartDate -EndDate
B: -InputFile -LastNumDays
C: -Smtp -StartDate -EndDate
D: -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-LastNumDays [ ] test.ps1 -InputFile -StartDate -EndDate [ ] test.ps1 -Smtp -LastNumDays [ ] test.ps1 -Smtp -StartDate -EndDate [ ]
Обратите внимание, что бессмысленно указывать значение по умолчанию для обязательного параметра (-LastNumDays
), потому что вы все равно должны предоставить значение.