您的位置:首页 > 运维架构 > Shell

在PowerShell中创建动态参数和参数验证

2015-06-02 15:51 573 查看
今天要来聊一聊关于PowerShell中的动态参数,按照官方帮助文档来说所谓动态参数是在基于cmdlet,方法和脚本有明确值的条件下产生的。

比如,一些cmdlet的参数只能在某个驱动提供器时才有效;或者这样说,Encoding参数只能在Add-Content或者Get-Content等cmdlets有效。废话不多说,还是以例子为准吧。

以前,我们想要实现一个动态参数值的效果可以使用如下方法:

Function DynamicParameter
{
[CmdletBinding()]
Param
(
[Parameter()]
[ValidateSet('One','Two','Three','Four','Five')]
[String]$CustomParameter
)
}
这个例子中,我们用到了ValidateSet类型来提前设置静态参数值,我们可以简单的运行该方法,看到效果图如下,已经预先得到了所有我们设置的值:



但是这并不能做到真正的动态参数值。比如,如果我们想要的未必提前就已经准备好了,怎么办呢?这里就要用到真正的动态参数了,要创建一个动态参数,首先我们要使用DynamicParam关键字来声明我们要创建的动态参数。

Function Get-Sample
{
[CmdletBinding()]
Param()

<strong>    DynamicParam
{

}</strong>
}


在具体说之前,我们先看一下整个方法的全面定义结构。

<pre name="code" class="plain">Function Get-Sample
{
[CmdletBinding()]
Param()

DynamicParam
{
$Attributes = New-Object System.Management.Automation.ParameterAttribute
$Attributes.Mandatory = $false
$Attributes.ParameterSetName = '__AllParameterSets'
$Attributes.ValueFromPipeline = $false
$Attributes.ValueFromPipelineByPropertyName = $false

$AttributeCollection = New-Object System.Collections.ObjectModel.Collection[System.Attribute]
$AttributeCollection.Add($Attributes)
$AttributeCollection.Add((New-Object System.Management.Automation.ValidateSetAttribute(Get-ChildItem C:\XMLSample -File | Select-Object -ExpandProperty Name)))

$DynParam1 = New-Object -TypeName System.Management.Automation.RuntimeDefinedParameter("DynamicParam",[String],$AttributeCollection)

$ParamDictionary = New-Object -TypeName System.Management.Automation.RuntimeDefinedParameterDictionary
$ParamDictionary.Add("DynamicParam",$DynParam1)

return $ParamDictionary
}
}

Get-Sample


这里我们如下如下代码,自定义我们的参数属性信息:
New-Object System.Management.Automation.ParameterAttribute

然后我们对这个对象里的各个属性值设定信息。

$Attributes = New-Object System.Management.Automation.ParameterAttribute
$Attributes.Mandatory = $false
$Attributes.ParameterSetName = '__AllParameterSets'
$Attributes.ValueFromPipeline = $false
$Attributes.ValueFromPipelineByPropertyName = $false
最后我们将设置的属性信息,用我们新创建的如下对象添加进来:

$AttributeCollection = New-Object System.Collections.ObjectModel.Collection[System.Attribute]
$AttributeCollection.Add($Attributes)
因为我这里想要做的是让动态参数按Tab键能够动态的得到确定的值,所以我们要创建如下对象,并将它添加进去。

$AttributeCollection.Add((New-Object System.Management.Automation.ValidateSetAttribute(Get-ChildItem C:\XMLSample -File | Select-Object -ExpandProperty Name)))
如我们之前所说,每个动态参数必须是在某个驱动提供器内时才可用,所以你可以看到如上例子我们在做有效属性验证的时候设定了用Get-Childitem Cmdlet在某个文件夹下遍历信息,并输出属性名作为值。

最后我们要使用如下方法,初始化一个对象并添加我们的动态参数名。
$DynParam1 = New-Object -TypeName System.Management.Automation.RuntimeDefinedParameter("DynamicParam",[String],$AttributeCollection)

$ParamDictionary = New-Object -TypeName System.Management.Automation.RuntimeDefinedParameterDictionary
$ParamDictionary.Add("DynamicParam",$DynParam1)

return $ParamDictionary
我们运行这个方法可以得到如下效果,按住Tab键切换我们得到了动态的参数值。



我们可以看到列表里罗列的三个文件名就是我们动态参数之前设定在C:\XMLSample下的文件列表信息。我们尝试在C:\XMLSample文件夹下新添加一个文件,再次回到脚本验证下,很明显动态参数已经动态的获得了新文件名,很棒吧:)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: