С вашим примером, которым вы поделились с нами, следующие допустимые наборы параметров будут:
#Parameterset "I"
ModifyState -InputFile PARAMVALUE -Object PARAMVALUE -Inactive
#Parameterset "A"
ModifyState -InputFile PARAMVALUE -Object PARAMVALUE -Active
Если вы планируете использовать только эти 2 набора параметров, и у вас есть некоторые параметры, которые должны быть действительны для обоих, вы на самом делене нужно объявлять их в наборах параметров - если только они не будут вести себя по-другому .
Так что ваш пример может быть написан так:
function ModifyState (
[string]$InputFile,
[string]$Object,
[Parameter(Mandatory = $false, ParameterSetName = "A")]
[switch]$Active,
[Parameter(Mandatory = $false, ParameterSetName = "I")]
[switch]$Inactive) {
switch ($PsCmdlet.ParameterSetName) {
"A" {
if ($InputFile) {
foreach ($obj in (gc $InputFile)) {
write-host "Activate $obj"
}
}
else {write-host "Activate $Object"}
}
"I" {
if ($InputFile) {
foreach ($obj in (gc $InputFile)) {
write-host "Deactivate $obj"
}
}
else {write-host "Deactivate $Object"}
}
}
}
Если вы планируетепри выполнении вашей функции без каких-либо параметров вам необходимо предоставить раздел [CmdletBinding(DefaultParameterSetName = 'Default')]
и указать значения параметров по умолчанию.
function ModifyState {
[CmdletBinding(DefaultParameterSetName = 'A')]
param(
[string]$InputFile = "Filepath",
[string]$Object,
[Parameter(Mandatory = $false, ParameterSetName = "A")]
[switch]$Active = [switch]::Present,
[Parameter(Mandatory = $false, ParameterSetName = "I")]
[switch]$Inactive) {
switch ($PsCmdlet.ParameterSetName) {
"A" {
if ($InputFile) {
foreach ($obj in (gc $InputFile)) {
write-host "Activate $obj"
}
}
else {write-host "Activate $Object"}
}
"I" {
if ($InputFile) {
foreach ($obj in (gc $InputFile)) {
write-host "Deactivate $obj"
}
}
else {write-host "Deactivate $Object"}
}
}
}
}
Это позволит вам запустить функцию без параметров.Параметр -Active всегда будет установлен, а параметр -InputFile всегда будет указывать на файл, который вы указали в качестве значения по умолчанию.
Имея все это на месте - чего вы ожидаете от ModifyState -InputFile .\temp.txt -Inactive -Active
?
Либо вы должны использовать:
ModifyState -InputFile .\temp.txt -Inactive
или
ModifyState -InputFile .\temp.txt -Active
с текущими наборами параметров, которые вы определили.
Пожалуйста, уточните свой вопрос с более подробной информацией о том, что вы пытаетесь решить, чтобы мы могли помочь вам на вашем пути.