Cmdlet开发与学习(五)

      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     }

      

原文地址:https://www.cnblogs.com/ByronsHome/p/3721720.html