Ich habe Don Jones den Powershell-Guru in einem anderen Forum gefragt und er gab mir die Informationen, die ich brauchte. Er erklärte es mir damit:
Wenn ich die Frage verstehe, müssen Sie grundsätzlich alle möglichen Kombinationen ausrechnen. Denken Sie daran, dass ein Parameter zu mehr als 1 Parametersätzen gehören kann. Möglicherweise haben Sie also einen Satz mit Computername und OULevel, Computername und ComputerOU sowie Computername und AllCompany. Das sind drei. Dann die drei nochmal für IPAddress. Ich weiß, dass es nicht elegant ist, aber schauen Sie sich die Hilfe für Where-Object an - auch nicht bei weitem. Liste würde dann nicht zu einer Menge gehören, was bedeutet, dass sie allen gehören würde.
Das brachte mich auf die richtige Spur. Also habe ich letztendlich die Funktionsweise meines Cmdlets geändert, sodass meine Antwort überarbeitet wurde. Jetzt, da ich verstehe, was zu tun ist, werde ich mein vorhandenes Beispiel aktualisieren, damit ich konsequent sein und hoffentlich helfen kann.
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 )
Da ich nicht wollte, dass diese drei Parameter miteinander verwendet werden, mussten sie zu ihren eigenen Parametersätzen gehören. Wenn Sie also versuchen, einen Parameter zu verwenden, werden die anderen nicht als Option angezeigt. Dies erleichtert und vereinfacht den Skriptprozess selbst. Anstatt zuzulassen, dass das Skript selbst Benutzereingaben berücksichtigt, werden diese Optionen durch die Powershell-Parametersätze entfernt.
Der $ List-Parameter hat keinen Parametersatznamen, da dieser Parameter in jedem Szenario verfügbar sein soll.