当前位置: 首页 > 知识库问答 >
问题:

Powershell[validateSet()]在使用相同参数名的单独参数集之间

程吕恭
2023-03-14

好的,所以我正在尝试编写一个高级函数,它使用两个不同的参数集名称,一个是default另一个是testaccountsonly

这大部分工作都很好,但是,我的问题是:

get-help new-secondaryAccount的输出在语法部分给出了以下内容:

SYNTAX
    New-SecondaryAccount [-Name] <String> [-AccountType] <String> [-Password] <String> [-Description] <String> [-OwnerEmployeeID] <String> 
    [[-AdditionalDescription]] [<CommonParameters>]

    New-SecondaryAccount [-Name] <String> [-AccountType] <String> [-Password] <String> [-CoreOrReserved] <String> [-Description] <String> 
    [-OwnerEmployeeID] <String> [[-AdditionalDescription]] [<CommonParameters>]

从外观上看,这正是我想要的--一个参数集,我可以在其中验证几个不同的-AccountType列表,并在其中移动,我有密码、描述等;另一个参数集,我只验证AccountType的一个值,并有一个只属于TestAccountOnly参数集的CoreorReserve参数。

不幸的是,在ISE中尝试测试时,如果输入:

new-SecondaryAccount-Name MehSomeAccount-AccountType,我从IntelliSense得到的唯一建议是test

您能不能不要像我尝试的那样使用[validateSet()],还是我做错了?

如果有人能指出这一点,我会非常感激的!

Function New-SecondaryAccount(DefaultParameterSetName="Default")
{
<#
.Synopsis
   Creates a new secondary account based on the parameters
.DESCRIPTION
    Creates a secondary AD user account based on parameters
    specified. This includes several different types of accounts,
    and determines the employeeType, OU, and description values
    of the account created.

    The CoreOrReserved parameter can only be used for accounts
    where AccountType is set to Test
.INPUTS
   [String]
.OUTPUTS
   [ADObject]
.NOTES

.COMPONENT
    MyModule_Part1
.FUNCTIONALITY
   Active Directory Things
#>
    [cmdletBinding(DefaultParameterSetName="Default")]
    param(
        [Parameter(Mandatory=$True,
                    Position=0,
                    ParameterSetName="Default",
                    ValueFromPipeline=$True,
                    ValueFromPipelineByPropertyName=$True)]
        [ValidateNotNull()]
        [ValidateNotNullOrEmpty()]
        [Parameter(Mandatory=$True,
                    Position=0,
                    ParameterSetName="TestAccountsOnly",
                    ValueFromPipeline=$True,
                    ValueFromPipelineByPropertyName=$True)]
        [ValidateNotNull()]
        [ValidateNotNullOrEmpty()]
        [String]$Name,

        [Parameter(Mandatory=$True,
                    Position=1,
                    ParameterSetName="Default")]
        [ValidateNotNull()]
        [ValidateNotNullOrEmpty()]
        [ValidateSet('ADAdmin','ServerAdmin','ServiceAccount','ChuckNorris')]
        [Parameter(Mandatory=$True,
                    Position=1,
                    ParameterSetName="TestAccountsOnly")]
        [ValidateNotNull()]
        [ValidateNotNullOrEmpty()]
        [ValidateSet("Test")]
        [String]$AccountType,

        [Parameter(Mandatory=$True,
                    Position=2,
                    ParameterSetName="Default")]
        [ValidateNotNull()]
        [ValidateNotNullOrEmpty()]
        [ValidateScript(
        {
            if($_.Length -ge 12)
            {
                $True
            }
            else
            {
                throw "Password must be at least 12 characters"
                $False
            }
        })]
        [Parameter(Mandatory=$True,
                    Position=3,
                    ParameterSetName="TestAccountsOnly")]
        [ValidateNotNull()]
        [ValidateNotNullOrEmpty()]
        [ValidateScript(
        {
            if($_.Length -ge 12)
            {
                $True
            }
            else
            {
                throw "Password must be at least 12 characters"
                $False
            }
        })]
        [String]$Password,

        [Parameter(Mandatory=$True,
                    Position=2,
                    ParameterSetName="TestAccountsOnly")]
        [ValidateNotNull()]
        [ValidateNotNullOrEmpty()]
        [ValidateSet("Core","Reserved")]
        [String]$CoreOrReserved,

        [Parameter(Mandatory=$True,
                    Position=3,
                    ParameterSetName="Default")]
        [ValidateNotNull()]
        [ValidateNotNullOrEmpty()]
        [ValidateScript(
        {
            if($_ -match "^TASK\d{7}\b")
            {
                $True
            }
            else
            {
                throw "Description must be a TASK number only`nEx. TASK1234567"
                $False
            }
        })]
        [Parameter(Mandatory=$True,
                    Position=4,
                    ParameterSetName="TestAccountsOnly")]
        [ValidateNotNull()]
        [ValidateNotNullOrEmpty()]
        [ValidateScript(
        {
            if($_ -match "^TASK\d{7}\b")
            {
                $True
            }
            else
            {
                throw "Description must be a TASK number only`nEx. TASK1234567"
                $False
            }
        })]
        [String]$Description,

        [Parameter(Mandatory=$True,
                    Position=4,
                    ParameterSetName="Default")]
        [ValidateNotNull()]
        [ValidateNotNullOrEmpty()]
        [ValidateScript(
        {
            if($(Get-ADUser -Filter {EmployeeID -eq $_ -and EmployeeType -eq "E"}) -ne $NULL)
            {
                $True
            }
            else
            {
                throw "$_ must correspond to a valid FTE user's employeeID number"
                $False
            }
        })]
        [Parameter(Mandatory=$True,
                    Position=5,
                    ParameterSetName="TestAccountsOnly")]
        [ValidateNotNull()]
        [ValidateNotNullOrEmpty()]
        [ValidateScript(
        {
            if($(Get-ADUser -Filter {EmployeeID -eq $_ -and EmployeeType -eq "E"}) -ne $NULL)
            {
                $True
            }
            else
            {
                throw "$_ must correspond to a valid FTE user's employeeID number"
                $False
            }
        })]
        [String]$OwnerEmployeeID,

        [Parameter(Mandatory=$False,
                    ParameterSetName="Default",
                    Position=5)]
        [Parameter(Mandatory=$False,
                    ParameterSetName="TestAccountsOnly",
                    Position=6)]
        [Switch]$AdditionalDescription

    )
    BEGIN{}
    PROCESS{# implementation doing all the things here}
    END{}

共有1个答案

南门鸿畴
2023-03-14

不幸的是,您不能为每个参数声明多个validate set属性,这也是它的指定是分开的一个原因。

您可能可以使用动态参数来获得您想要的。为了清楚起见,我去掉了很多东西。

function New-SecondaryAccount() {
    [cmdletBinding()]
    param (
        [Parameter(Mandatory,
            Position = 0,
            ValueFromPipeline,
            ValueFromPipelineByPropertyName)]
        [string] $Name,

        [Parameter(Mandatory, Position = 1)]
        [string] $Password,

        [Parameter(Position = 2)]
        [switch] $TestAccount
    )
    DynamicParam {
        $attribute = New-Object System.Management.Automation.ParameterAttribute
        $attribute.Mandatory = $true

        $collection = New-Object System.Collections.ObjectModel.Collection[System.Attribute]
        $collection.Add($attribute)

        if ($TestAccount) {
            $validationSet = @("Test")
        } else {
            $validationSet = @("ADAdmin", "ServerAdmin", "ServiceAccount", "ChuckNorris")
        }
        $collection.Add((New-Object System.Management.Automation.ValidateSetAttribute($validationSet)))  

        $param = New-Object System.Management.Automation.RuntimeDefinedParameter('AccountType', [string], $collection)
        $dictionary = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary
        $dictionary.Add('AccountType', $param)  

        return $dictionary
    }

    PROCESS {
        <# implementation doing all the things here #>
    }
}
 类似资料:
  • 我正在用PowerShell编写一个脚本,在某个时候我需要在函数参数上使用ValidateSet。这是一个非常好的功能,但我需要的是更多的东西。 例如: 因此,此代码段允许我从列表中选择一个项目,如 然后将其打印到屏幕上。我想知道是否有可能允许选择多个值并将它们传递给来自一个验证集的函数,如下所示 也许有一个图书馆,或者我只是错过了一些东西,但我真的找不到一个解决方案。

  • 是否可以使参数验证集与通配符一起工作? 我希望在位置接受0-100。 错误消息: 无法验证参数“variable”得参数.参数“6.1.1.0”不属于集合“6.1...”由ValidateSet属性指定。提供一个集合中的参数,然后重试该命令。+CategoryInfo:InvalidData:(:)[],ParentContainsErrorRecordException+FullyQualifi

  • 本文向大家介绍PowerShell小技巧之同时使用可选强制参数,包括了PowerShell小技巧之同时使用可选强制参数的使用技巧和注意事项,需要的朋友参考一下 在下面脚本函数中让可选参数和强制参数必须同时使用。 下面演示当可选参数出现,也必须使用这个强制参数。 支持所有PS版本

  • 本文向大家介绍如何在PowerShell中使用ErrorAction参数?,包括了如何在PowerShell中使用ErrorAction参数?的使用技巧和注意事项,需要的朋友参考一下 像ErrorActionPreference变量一样,ErrorAction参数的工作原理类似。高级功能和PowerShell中大多数内置cmdlet均支持ErrorAction参数。将非终止错误转换为终止错误,然后

  • 这个问题是如何为WS设置参数的扩展。播放2.1 Java中的post() 我的Web服务请求处理程序如下 因为WSaskestHolder接受一个

  • 在过去的两天里,我一直在学习React,我在理解URL参数方面遇到了困难。 假设我想要一个路由。路线的定义如下: 现在我希望在另一个文件中定义的对象能够使用值。我该怎么做?我已经找到了关于路由url参数的教程,但没有一个解释如何实现这一点。 下面是我的视图现在的样子: 在哪里可以获得详细信息中的?我试过: 但是,未定义。