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 }

Cmdlet开发与学习(五)

时间: 05-09

Cmdlet开发与学习(五)的相关文章

Cmdlet开发与学习(四)

前面讲完了一个基本的cmdlet的开发流程,下面将陆续地完善cmdlet的功能细节以及补充.       支持ShouldProcess       有的cmdlet操作有很大的破坏性,因此有必要再命令执行前提醒用户注意一些可能的执行后果,也就是说,存在与用户的交互.这个时候,通过使用ShouldProcess,可以达到预期的效果. 1 [Cmdlet(VerbsCommon.Get,"SQLServerBackupFile", 2 SupportsShouldProcess = tr

Cmdlet开发与学习(六)

之前的内容主要是关于cmdlet开发的,下面要将的内容,是关于在应用程序中集成PowerShell引擎. 运行空间和管道       Runspace类是PowerShell引擎API的重要组成部分,Runspace实例代表一个PowerShell执行引擎实例,其中包含自己的一系列变量,驱动器映射,函数等.这些资源统称为运行空间的"会话状态". 创建并调用Pipeline类的实例,我们就可以在运行空间中使用命令行.Pipeline类实例代表PowerShell命令行对象,其中包含各种命

Cmdlet开发与学习(二)

继续上一篇的内容,既然已经定义好了命令,那么我们还可以参数绑定,定义自己的参数对象. 3.定义属性,即cmdlet参数对象       参数绑定时基于cmdlet元数据进行的,cmdlet元数据是在命令发现过程中得到的.首先,基于cmdlet的类型(包括可执行程序,脚本文件,内置函数等),PowerShell实例化一个cmdlet.然后,通过查询cmdlet元数据中的参数信息,判断参数列表是否合法,或者,该命令参数是否需要参数值. 参数绑定的实现相当简单,只需要对属性加上Parameter标示符

Cmdlet开发与学习(一)

Windows Powershell和cmdlet的学习是一个积累的过程.最近在学习编写自定义的Cmdlet封装一些命令,以此记录自己的学习心得. 自定义cmdlet的实现大致可以分为以下几步: 1.将.Net类声明为cmdlet 2.继承自类PSCmdlet或者Cmdlet 3.定义属性,即cmdlet参数对象 4.重写cmdlet记录处理的方法 5.流程或诊断信息输出,错误以及异常处理 6.PSSnapIn和Module 1.将.Net类声明为cmdlet        要将.Net类声明为

Cmdlet开发与学习(三)

5.流程或诊断信息输出,错误以及异常处理       在使用PowerShell的过程中,如果cmdlet执行有输出结果,我们会在PS界面看到结果输出信息.如果cmdlet执行出现异常,那我们就会看到异常信息.接着我们就开始学习这些输出信息的实现. Cmdlet基类给我们提供了几种输出方法:WriteDebug, WriteError, WriteObject, WriteProcess, WriteVerbose, WriteWarning. WriteDebug:该方法是为cmdlet开发人

Cmdlet开发与学习(七)

到目前的例子为止,我们使用的都是不带参数的CreateRunspace()方法创建的运行空间实例,这就意味着,我们使用的都是默认的命令集合,提供程序,初始化脚本和格式信息. 但是,这些默认的配置信息都是可以控制的,这要通过RunspaceConfiguration类实现.RunspaceConfiguration类是CreateRunspace函数的参数.创建运行空间实例后,其中的会话状态变量可以通过运行空间实例的SessionStateProxy来设置和获取. 注意:如果运行空间处于Befor

ios开发runtime学习五:KVC以及KVO,利用runtime实现字典转模型

一:KVC和KVO的学习 #import "StatusItem.h" /* 1:总结:KVC赋值:1:setValuesForKeysWithDictionary实现原理:遍历字典,得到所有的key,value值,再利用kvc, setVaue forkey来为value赋值 2: [item setValue:@"来自即刻笔记" forKey:@"source"],内部的底层实现, 1.首先去模型中查找有没有setSource,找到,直接调用

ios开发网络学习五:MiMEType ,多线程下载文件思路,文件的压缩和解压缩

一:MiMEType:一般可以再百度上搜索到相应文件的MiMEType,或是利用c语言的api去获取文件的MiMEType : //对该文件发送一个异步请求,拿到文件的MIMEType - (void)MIMEType { //    NSString *file = @"file:///Users/文顶顶/Desktop/test.png"; [NSURLConnection sendAsynchronousRequest:[NSURLRequest requestWithURL:[

微信公众平台开发(学习)1

在这篇微信公众平台开发教程中,我们假定你已经有了PHP语言程序.MySQL数据库.计算机网络通讯.及HTTP/XML/CSS/JS等基础. 我们将使用微信公众账号方倍工作室作为讲解的例子,二维码见底部. 本系列教程将引导你完成如下任务: 创建新浪云计算平台应用 启用微信公众平台开发模式 基础接口消息及事件 微信公众平台PHP SDK 微信公众平台开发模式原理 开发天气预报功能 第一章 申请服务器资源 创建新浪云计算应用 申请账号 我们使用SAE新浪云计算平台作为服务器资源,并且申请PHP环境+M