Parameter
在声明cmdlet参数的时候,我们使用了Parameter标识符,在这个标识符中,有些参数需要了解到。
强制参数
设置Mandatory=true即可。
对于强制参数,不管是在命令行中绑定,还是通过管道输入,在命令逻辑执行之前,它就必须绑定好。如果强制参数没有参数值的话,PowerShell会弹出对话框,要求用户提供参数值。
位置参数、
Position= n
有时,我们在使用Powershell的时候,发现仅仅是输入参数值,并没有指定具体参数名,命令依然能够正常执行。
PowerShell支持位置参数,即根据参数的位置进行参数值绑定,这样,在命令行中就不必显示地指定参数名了。
如果使用位置参数,还需要知道位置参数的赋值绑定过程:
1.有名称的先绑定,即在命令行中显示指定了参数名的先绑定
2.PowerShell将命令行中未绑定的参数值放到一个表中,称为”未绑定参数值列表“,其中的参数值按照命令行中出现的位置排列
3.PowerShell将未绑定的位置参数放到一个表中,称为”未绑定位置参数列表“,其中的命令参数按照cmdlet声明中的位置信息进行排列
4.未绑定参数值列表和未绑定位置参数列表逐个进行匹配绑定。如果有多余的未绑定参数值的话,则参数绑定过程报错
剩余参数值参数
ValueFromRemainingArguments = true
这是一个特殊的位置参数,当有名称的参数和位置参数都结束绑定后,剩余参数值参数接受表中的剩余参数值。
很多时候,剩余参数值不止一个,因此剩余参数值参数都定义为数组。
参数集合
ParameterSetName = ”“
通常,cmdlet需要处理各种不同组合中出现的参数。参数集合将参数分为互斥的集合。
但是,使用参数集合时,要注意,如果命令行没有参数值,会导致参数集合解析错误。为了避免这种情况,可以选择一个最一般的参数集合进行绑定,指明为默认参数集合。具体例子见后文。
与参数集合有关的参数绑定,在绑定过程中,PowerShell按照下面步骤判断使用哪一个参数集合
1.有名称的参数绑定
2.位置参数绑定
3.管道参数绑定
参数值验证
参数值验证在绑定之前进行,主要是验证参数值的合法性。当然,也可以自定义参数值验证属性,需要直接或间接继承ValidateArgumentAttribute类,重写ValidateElement方法。
ValueFromPipeline和ValueFromPipelineByPropertyName
相信大家都这么使用过PS命令: cmdlet1 | cmdlet2
将cmdlet1的输出,作为cmdlet2的输入。如果希望实现这样的效果,不妨试一下ValueFromPipeline和ValueFromPipelineByPropertyName
ValueFromPipelin: 如果参数值没有在命令行中指定的话,它可以和管道输入的对象绑定在一起。
ValueFromPipelineByPropertyName:如果参数值没有在命令行中指定的话,它可以和管道输入对象的属性绑定在一起。
以上关于Parameter的介绍到这里,下面用一个具体的例子来看一下。
1 [Cmdlet(VerbsCommon.Get,"SQLServerBackupFile", 2 SupportsShouldProcess = true, ConfirmImpact = ConfirmImpact.Medium, 3 DefaultParameterSetName = "PathInfo")] 4 public class GetSQLServerBackup : PSCmdlet 5 { 6 private string path; 7 8 [Parameter(Mandatory = true, ParameterSetName = "PathInfo" , Position =1, 9 ValueFromPipeline = true, ValueFromPipelineByPropertyName = true)] 10 [ValidateNotNullOrEmpty] 11 public string Path 12 { 13 get { return path; } 14 set { path = value; } 15 } 16 17 private FileInfo fileInfo; 18 19 [Parameter(Mandatory = true, ParameterSetName = "FileInfoSet", Position =1, 20 ValueFromPipeline = true, ValueFromPipelineByPropertyName = true)] 21 public FileInfo FileInfo 22 { 23 get { return fileInfo; } 24 set { fileInfo = value; } 25 } 26 27 private object[] arguments; 28 29 [Parameter(ValueFromRemainingArguments = true)] 30 public object[] Arguments 31 { 32 get { return arguments; } 33 set { arguments = value; } 34 } 35 36 37 protected override void ProcessRecord() 38 { 39 if (Directory.Exists(path)) 40 { 41 if (this.ShouldProcess(path, "Show Specified Directory " + path)) 42 { 43 string[] files = Directory.GetFiles(path); 44 foreach (string itemFile in files) 45 { 46 FileInfo tempInfo = new FileInfo(itemFile); 47 if (tempInfo.Extension.Equals(".bak", StringComparison.OrdinalIgnoreCase)) 48 { 49 WriteObject(tempInfo); 50 } 51 } 52 } 53 } 54 55 if (null != fileInfo) 56 { 57 WriteObject(fileInfo); 58 } 59 } 60 }