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 }
Cmdlet开发与学习(五)