Ответ mclayton является верным в том смысле, что вам придется использовать 6 имен наборов параметров.
Существует три «временных» параметра, которые должны исключать друг друга и должны использоваться вместе содин из двух параметров 'path'.
Однако не следует использовать $input
в качестве параметра, поскольку это Автоматическая переменная в качестве Матиас Р. Джессен ужепрокомментировал, и поскольку вы устанавливаете параметр $Years
со значением по умолчанию, Mandatory
должно быть $false
для этого.
Поскольку использование комбинаций наборов параметров всегда является загадкой, я бы поставилпараметры в более логичном порядке (по крайней мере для меня ..), сначала определив два параметра 'пути' и установив DefaultParameterSetName
в качестве первого из них. Кроме того, добавив Position = 0
к этому первому параметру, вы можете вызывать функцию только путем, не называя его.
Просто поиграйте с функцией ниже, чтобы увидеть, какие комбинации возможны и какая функция будетиспользуйте:
function Show-Parameters {
[CmdletBinding(DefaultParameterSetName = 'ByFolderYears')]
param (
[Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true, ParameterSetName = 'ByFolderYears')]
[Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true, ParameterSetName = 'ByFolderMonths')]
[Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true, ParameterSetName = 'ByFolderDays')]
[Alias('Path')]
[string[]]$FolderPath,
[Parameter(Mandatory = $true, ParameterSetName = 'ByFileYears')]
[Parameter(Mandatory = $true, ParameterSetName = 'ByFileMonths')]
[Parameter(Mandatory = $true, ParameterSetName = 'ByFileDays')]
[Alias('File')]
[string]$FilePath,
[Parameter(Mandatory = $false, ParameterSetName = 'ByFolderYears')]
[Parameter(Mandatory = $false, ParameterSetName = 'ByFileYears')]
[int]$Years = 7,
[Parameter(Mandatory = $true, ParameterSetName = 'ByFolderMonths')]
[Parameter(Mandatory = $true, ParameterSetName = 'ByFileMonths')]
[int]$Months,
[Parameter(Mandatory = $true, ParameterSetName = 'ByFolderDays')]
[Parameter(Mandatory = $true, ParameterSetName = 'ByFileDays')]
[int]$Days,
[string[]]$Filter = '*.*',
[string]$ReportPath = $PWD,
[switch]$Recurse
)
# just to show what parameter the function will use
$paramsUsed = [ordered]@{}
$paramSet = $PSCmdlet.ParameterSetName
if ($paramSet.StartsWith('ByFolder')) { $paramsUsed['FolderPath'] = $FolderPath -join '; ' }
else {$paramsUsed['FilePath'] = $FilePath}
if ($paramSet.EndsWith('Years')) { $paramsUsed['Years'] = $Years }
elseif ($paramSet.EndsWith('Months')) { $paramsUsed['Months'] = $Months }
else { $paramsUsed['Days'] = $Days }
if ($Filter) { $paramsUsed['Filter'] = $Filter -join '; ' }
if ($ReportPath) { $paramsUsed['ReportPath'] = $ReportPath }
if ($Recurse) { $paramsUsed['Recurse'] = $Recurse }
Write-Host "Using ParameterSet '$paramSet'" -ForegroundColor Cyan
$paramsUsed
}
Например
Show-Parameters 'D:\some\path', 'Z:\some\folder'
выходы
Using ParameterSet 'ByFolderYears'
Name Value
---- -----
FolderPath D:\some\path; Z:\some\folder
Years 7
Filter *.*
ReportPath C:\Users\YourName
и т. д.