我试图为脚本模块创建一个函数,以在显示下一个参数之前验证是否已设置了上一个参数。
我需要的参数是身份,共享和配额。我一直希望显示身份,不希望在设置身份之前显示共享,并且我不希望在设置共享之前显示配额。
我可以轻松访问$ 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
{
}
}
最佳答案
我正在尝试复制您正在使用的“解决方法”,但是我只看到我可以访问动态参数Share
(而不是Quota
)。为了重现您的设置,由于我无权访问personfileutility.exe,因此我注释了两行,并在第三行中添加了将$type
硬编码为“faculty”的位置。例如,在两个地方,我将代码更新为:
#$lookup = [xml](\\servername\personalfiles\personfileutility.exe -a $Identity)
#$type = $lookup.User.user_directory.type.type
$type = "faculty"
完成这些更改后,我可以在指定
Share
之后访问Identity
参数。但是,我无法访问Quota
。您希望Quota
可用吗?如果我了解您要问的问题,则不希望
Share
可以访问(直到您现在可以使用Identity
)。但是您另外,您不希望Quota
和Identity
都填写好并且不知道如何使Share
可用。那是对的吗?如果我正确地理解了该问题,那么我不认为PowerShell提供了一种使用Commandlet绑定(bind)来实现该功能的机制。我认为您可以通过使用GUI应用程序或以交互方式提示用户输入来实现此目的。
关于powershell - PowerShell多个DynamicParam,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17200515/