我正在使用Powershell 4.0。
我正在尝试编写一个cmdlet,在此cmdlet中,我想使用“高级参数集”来根据选择的参数选择某些选项。这个特定的函数本质上并最终将是Get-ADComputer,但对于某些选项预编程了-SearchBase。
我总共有6个参数。2是字符串($ ComputerName或$ IpAddress),1是整数($ OULevel)和3个开关($ ComputerOU,$ AllCompany,$ List)。
我为ComputerName和IPAddress分别设置了一个参数,我希望用户能够输入一个或另一个-我想我已经弄清楚了它很简单。但是,我希望$ OULevel,$ ComputerOU和$ AllCompany是排他性的,如果使用了一个,则不能使用另一个。$ List在每种情况下均应保持可用。
我尝试了各种参数集的变体,但都没有用。这是我的脚本现在的样子,并进行了一些修整:
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.')]
[Alias('Computer','CN')]
[string]$ComputerName,
[Parameter(Mandatory=$true,
ParameterSetName="IPAddress",
Position=0,
ValueFromPipeline=$false,
HelpMessage='Enter an IP address to search in ActiveDirectory.')]
[Alias('IPv4Address','IPv6Address')]
[string]$IPAddress,
[Parameter(Mandatory=$false,
HelpMessage='Enter a number between 0 and 8. 0 is your current OU Container.')]
[ValidateRange(0,8)]
[int]$OULevel = 0,
[Parameter()]
[Switch]$ComputerOU,
[Parameter()]
[Switch]$AllCompany,
[Parameter()]
[Switch]$List
)
如果您好奇我们的广告是按位置,类别(计算机,用户,组,联系人等)组织的,则在下面的每个OU中它会变得更加细化。该脚本检测您计算机的OU并在此处开始搜索。$ OULevel的目的是,如果用户指定了另一个数字,则搜索将从另一个OU开始,然后进行递归搜索。$ ComputerOU的目的是使您的搜索转到默认的Computers OU,而不是整个域或您的位置。$ AllCompany的目的是使搜索默认到整个域,而不是其他任何选择或OU。
任何指导表示赞赏。如果我的脚本不知所措,我似乎无法掌握这一点。
我在另一个论坛上问了唐·琼斯(Don Jones)这个强大的专家,他给了我我所需要的信息。他通过这样对我解释:
如果我理解这个问题,那么您基本上必须排除所有可能的组合。请记住,一个参数可以属于1+个参数集。因此,您可能有一个包含Computername和OULevel,Computername和ComputerOU以及Computername和AllCompany的集合。那是三个。然后再将这三个用于IPAddress。我知道它不是很优雅,但是请看一下Where-Object的帮助-到目前为止也不是很优雅。然后,列表将不属于集合,这意味着列表将属于所有集合。
那使我走上了正轨。因此,我实际上最终改变了cmdlet的工作方式,因此重新修改了我的答案,但是现在我知道该怎么做了,我将更新现有示例,以便我能持之以恒并希望能为您提供帮助。
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参数没有参数集名称,因为我希望该参数在每种情况下都可用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句