在PowerShell中创建动态参数和参数验证
2015-06-02 15:51
573 查看
今天要来聊一聊关于PowerShell中的动态参数,按照官方帮助文档来说所谓动态参数是在基于cmdlet,方法和脚本有明确值的条件下产生的。
比如,一些cmdlet的参数只能在某个驱动提供器时才有效;或者这样说,Encoding参数只能在Add-Content或者Get-Content等cmdlets有效。废话不多说,还是以例子为准吧。
以前,我们想要实现一个动态参数值的效果可以使用如下方法:
但是这并不能做到真正的动态参数值。比如,如果我们想要的未必提前就已经准备好了,怎么办呢?这里就要用到真正的动态参数了,要创建一个动态参数,首先我们要使用DynamicParam关键字来声明我们要创建的动态参数。
在具体说之前,我们先看一下整个方法的全面定义结构。
这里我们如下如下代码,自定义我们的参数属性信息:
然后我们对这个对象里的各个属性值设定信息。
最后我们要使用如下方法,初始化一个对象并添加我们的动态参数名。
我们可以看到列表里罗列的三个文件名就是我们动态参数之前设定在C:\XMLSample下的文件列表信息。我们尝试在C:\XMLSample文件夹下新添加一个文件,再次回到脚本验证下,很明显动态参数已经动态的获得了新文件名,很棒吧:)
比如,一些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文件夹下新添加一个文件,再次回到脚本验证下,很明显动态参数已经动态的获得了新文件名,很棒吧:)
相关文章推荐
- 第一个Shell脚本
- Shell编程——bash基础知识
- /bin/bash^M: bad interpreter: No such file or dire
- shell 脚本if 逻辑判断判断
- shell条件判断式语句
- 如何在linux shell中嵌入hbase命令
- cmder tips
- C语言程序中调用shell去执行代码
- shell-手机屏幕录制
- Advanced Bash-Shell Guide(Version 10) 学习笔记三
- Advanced Bash-Shell Guide(Version 10) 学习笔记二
- 几行shell帮你的xcode迅速自动批量打包ipa
- shell脚本删除N天前的文件夹-----附linux和mac上date命令的不同
- shell 模式匹配
- bash shell 连接socket
- 如何编写一个shellcode
- Eclipse Shell for Plugin
- PowerShell实现参数互斥示例
- PowerShell实现动态获取当前脚本运行时消耗的内存
- PowerShell Continue语句使用示例