2

我正在尝试为脚本模块创建一个函数,该函数在显示下一个参数之前验证前一个参数是否已设置。

我需要的参数是身份、共享和配额。我总是希望显示身份,在设置身份之前我不希望显示共享,并且我不希望在设置共享之前显示配额。

我可以轻松访问 $Identity,但无法从 DynamicParam{} 中访问 $Share。我使用 PowerGUI 逐步完成了脚本,只有在点击 Begin{} 时才能看到 $Share。

如果设置了身份,我有一种方法可以通过仅显示共享/配额来解决此问题,但最终我想了解如何根据先前设置的参数继续添加其他参数。

该函数的副本如下。personfileutility.exe 只是我们用来与各种系统交互以提供和收集用户信息的可执行文件。

function New-PersonalFiles
{
    [CmdletBinding()]
    Param
    (
        # Param1 help description
        [Parameter(Mandatory=$true)]
        $Identity
    )

    DynamicParam
        {
            $paramDictionary = new-object -Type System.Management.Automation.RuntimeDefinedParameterDictionary

            if (($Identity -notlike "") -or ($Identity -notlike $null)){
                $attributes = new-object System.Management.Automation.ParameterAttribute
                $attributes.ParameterSetName = "__AllParameterSets"
                $attributes.Mandatory = $true

                $lookup = [xml](\\servername\personalfiles\personfileutility.exe -a $Identity)

                $type = $lookup.User.user_directory.type.type

                if ($type -like "other" -or $type -like "staff") {
                    $arguments = @()
                    $arguments += "\\fileserver\sharename"
                }
                elseif ($type -like "faculty") {
                    $arguments = @()
                    $arguments += "\\fileserver\sharename"
                    $arguments += "\\fileserver\sharename2"

                }
                elseif ($type -like "student") {
                    $arguments = @()
                    $arguments += "\\fileserver2\sharename"
                }

                $ParamOptions = New-Object System.Management.Automation.ValidateSetAttribute -ArgumentList $arguments

                $attributeCollection = new-object -Type System.Collections.ObjectModel.Collection[System.Attribute]
                $attributeCollection.Add($attributes)
                $attributeCollection.Add($ParamOptions)


                $dynParam1 = new-object -Type System.Management.Automation.RuntimeDefinedParameter("Share", [String], $attributeCollection)

                $paramDictionary.Add("Share", $dynParam1)
            }

            if (($Share -like "\\fileserver\*"))
            {
                $attributes2 = new-object System.Management.Automation.ParameterAttribute
                $attributes2.ParameterSetName = "__AllParameterSets"
                $attributes2.Mandatory = $true

                $lookup = [xml](\\servername\personalfiles\personfileutility.exe -a $Identity)

                $type = $lookup.User.user_directory.type.type

                if ($type -like "other" -or $type -like "staff") {
                    $arguments = @()
                    $arguments += "15GB"
                    $arguments += "20GB"
                }
                elseif ($type -like "faculty") {
                    $arguments = @()
                    $arguments += "10GB"
                    $arguments += "15GB"

                }
                elseif ($type -like "student") {
                    $arguments = @()
                    $arguments += "5GB"
                    $arguments += "10GB"
                }

                $ParamOptions2 = New-Object System.Management.Automation.ValidateSetAttribute -ArgumentList $arguments2

                $attributeCollection2 = new-object -Type System.Collections.ObjectModel.Collection[System.Attribute]
                $attributeCollection2.Add($attributes2)
                $attributeCollection2.Add($ParamOptions2)


                $dynParam2 = new-object -Type System.Management.Automation.RuntimeDefinedParameter("Quota", [String], $attributeCollection2)

                $paramDictionary.Add("Quota", $dynParam2)
            }

            return $paramDictionary
        }

    <#
    .Synopsis
       Short description
    .DESCRIPTION
       Long description
    .EXAMPLE
       Example of how to use this cmdlet
    .EXAMPLE
       Another example of how to use this cmdlet
    #>

    Begin
    {
    }
    Process
    {
        \\servername\personalfiles\personfileutility.exe -a $Identity -c -q ((Invoke-Expression $PSBoundParameters.Quota)  / 1KB) -s $Share
    }
    End
    {
    }
}
4

1 回答 1

3

我正在尝试复制您正在使用的“解决方法”,但我只看到我可以访问动态参数Share(不是Quota)。为了重现您的设置,由于我无权访问 personfileutility.exe,因此我注释掉了两行并添加了第三行,我在其中硬编码$type为“教师”。例如,在两个地方我将代码更新为:

#$lookup = [xml](\\servername\personalfiles\personfileutility.exe -a $Identity)
#$type = $lookup.User.user_directory.type.type
$type = "faculty"

有了这些更改,我可以Share在指定Identity. 但是,我无法访问Quota. 您希望Quota有空吗?

如果我理解您要问的问题,那么您不希望Share在可访问之前Identity可以访问(您目前正在工作)。但是您此外,您不希望在两者都被填写Quota之前可以访问,并且您不知道如何使其工作。那是对的吗?IdentityShare

如果我正确理解了这个问题,我不相信 PowerShell 提供了一种机制来通过 Commandlet 绑定来实现这一点。我认为您可以通过使用 GUI 应用程序或以交互方式提示用户输入来完成这项工作。

于 2013-06-20T13:54:22.743 回答