• 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     }

          

  • 相关阅读:
    纪念一下なぞなぞゲーム
    071221 晴
    Sightseeing Cows poj3621
    【HDU 5721】Palace(平面最近点对)
    继承和多态的一些知识点
    3D Convex Hull HDU 3662 三维凸包
    Monthly Expense POJ 3273 二分
    确定比赛名次 HDU 1285拓扑排序裸题
    序列变换
    Dropping tests 二分+01分数规划
  • 原文地址:https://www.cnblogs.com/ByronsHome/p/3721720.html
Copyright © 2020-2023  润新知