Eu pedi a Don Jones o guru do powershell em outro fórum e ele me deu a informação que eu precisava. Ele me explicou isso dizendo:
If I'm understanding the question, then you basically have to factor out all the possible combinations. Remember that a param can belong to 1+ param sets. So, you might have a set with Computername and OULevel, Computername and ComputerOU, and Computername and AllCompany. That's three. Then those three again for IPAddress. I know it's not elegant, but look at the help for Where-Object – not elegant, either, by far. List would then not belong to a set, which means it would belong to all.
Isso me colocou no caminho certo. Então, na verdade, acabei mudando a maneira como meu cmdlet funcionava, então minha resposta foi reformulada, mas agora que entendi o que fazer, atualizarei meu exemplo existente para que possa ser consistente e, espero, ajudar.
function Get-CompanyADComputer{
[CmdletBinding(DefaultParametersetName="ComputerName")]
Param(
[Parameter(Mandatory=$true,
ParameterSetName="ComputerName",
Position=0,
ValueFromPipeline=$false,
HelpMessage='Enter a computer name to search in ActiveDirectory.')]
[Parameter(Mandatory=$true,
ParameterSetName="ComputerNameOULevel",
Position=0,
ValueFromPipeline=$false,
HelpMessage='Enter a computer name to search in ActiveDirectory.')]
[Parameter(Mandatory=$true,
ParameterSetName="ComputerNameComputerOU",
Position=0,
ValueFromPipeline=$false,
HelpMessage='Enter a computer name to search in ActiveDirectory.')]
[Parameter(Mandatory=$true,
ParameterSetName="ComputerNameAllCompany",
Position=0,
ValueFromPipeline=$false,
HelpMessage='Enter a computer name to search in ActiveDirectory.')]
[Alias('Computer','CN')]
[string]$ComputerName,
[Parameter(Mandatory=$true,
ParameterSetName="IPAddress",
Position=0,
ValueFromPipeline=$false,
HelpMessage='Enter an IP address to search in ActiveDirectory.')]
[Parameter(Mandatory=$true,
ParameterSetName="IPAddressOULevel",
Position=0,
ValueFromPipeline=$false,
HelpMessage='Enter an IP address to search in ActiveDirectory.')]
[Parameter(Mandatory=$true,
ParameterSetName="IPAddressComputerOU",
Position=0,
ValueFromPipeline=$false,
HelpMessage='Enter an IP address to search in ActiveDirectory.')]
[Parameter(Mandatory=$true,
ParameterSetName="IPAddressAllCompany",
Position=0,
ValueFromPipeline=$false,
HelpMessage='Enter an IP address to search in ActiveDirectory.')]
[Alias('IPv4Address','IPv6Address')]
[string]$IPAddress,
[Parameter(Mandatory=$false,
ParameterSetName="ComputerNameOULevel",
HelpMessage='Enter a number between 0 and 8. 0 is your current OU Container.')]
[Parameter(Mandatory=$false,
ParameterSetName="IPAddressOULevel",
HelpMessage='Enter a number between 0 and 8. 0 is your current OU Container.')]
[ValidateRange(0,8)]
[int]$OULevel = 0,
[Parameter(ParameterSetName="ComputerNameComputerOU")]
[Parameter(ParameterSetName="IPAddressComputerOU")]
[Switch]$ComputerOU,
[Parameter(ParameterSetName="ComputerNameAllCompany")]
[Parameter(ParameterSetName="IPAddressAllCompany")]
[Switch]$AllCompany,
[Parameter()]
[Switch]$List
)
Como eu não queria que esses 3 parâmetros fossem usados um com o outro, eles precisavam pertencer aos seus próprios Conjuntos de Parâmetros, então quando você tentar usar um parâmetro, os outros não aparecerão como uma opção. Isso ajuda muito e simplifica o próprio processo de script. Em vez de permitir que o próprio script contabilize a entrada do usuário, os conjuntos de parâmetros do Powershell eliminam essas opções.
O parâmetro $ List não tem um nome de conjunto de parâmetros porque eu quero que esse parâmetro esteja disponível em todos os cenários.