Я спросил у дона Джонса гуру powershell на другом форуме, и он дал мне информацию, которая мне была нужна. Он объяснил мне это, сказав следующее:
Если я понимаю вопрос, то вам, в принципе, нужно учесть все возможные комбинации. Помните, что параметр может принадлежать 1+ наборам параметров. Таким образом, у вас может быть набор с Computername и OULevel, Computername и ComputerOU, а также Computername и AllCompany. Это три. Затем эти три снова для IP-адреса. Я знаю, что это не элегантно, но посмотрите на помощь для Where-Object - тоже не элегантно. Список тогда не принадлежал бы набору, а это значит, что он принадлежал бы всем.
Это поставило меня на правильный путь. Поэтому я фактически изменил способ работы моего командлета, поэтому мой ответ был переработан, но теперь, когда я понимаю, что делать, я обновлю свой существующий пример, чтобы быть последовательным и, надеюсь, помочь.
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 )
Поскольку я не хотел, чтобы эти 3 параметра использовались друг с другом, они должны принадлежать их собственным наборам параметров, поэтому при попытке использовать один параметр другие не будут отображаться в качестве опции. Это очень помогает и упрощает сам процесс написания сценариев. Вместо того чтобы позволить самому сценарию учитывать пользовательский ввод, наборы параметров Powershell исключают эти параметры.
Параметр $ List не имеет имени набора параметров, потому что я хочу, чтобы этот параметр был доступен в каждом сценарии.