认清了Cmdlet的生存周期和执行的顺序对于我们后续的开发和使用有相当重要的意义,因为它直接决定了到时候该怎么开发,能实现哪些功能(比如说一直需要运行的程序,就不适合用Cmdlet来完成)。
先让我们看一下Cmdlet的生存周期:
1: [Cmdlet(VerbsCommon.Add, "Test")]
2: public class AddTest: Cmdlet
3: { 4:
5: protected override void BeginProcessing()
6: { 7: WriteObject("BeginProcessing"); 8: }
9:
10: protected override void ProcessRecord()
11: { 12: WriteObject("ProcessRecord"); 13: base.ProcessRecord();
14: }
15:
16: protected override void EndProcessing()
17: { 18: WriteObject("EndProcessing"); 19: base.EndProcessing();
20: }
21:
22: protected override void StopProcessing()
23: { 24: WriteObject("StopProcessing"); 25: base.StopProcessing();
26: }
27:
28: }
我们可以发现,结果是:
BeginProcessing
ProcessRecord
EndProcessing
基本上和我们猜测的一样的,初始化,执行,完成
可以判断StopProcessing这是在Cmdlet被中止的时候才会触发的。
再让我们看一下Cmdlet的生存周期:
1: public class TaskManager
2: { 3: private static int runCount = 0;
4: public static int Run()
5: { 6: return runCount ++;
7: }
8: }
1: [Cmdlet(VerbsCommon.Add, "Test")]
2: public class AddTest: Cmdlet
3: { 4: protected override void ProcessRecord()
5: { 6: WriteObject(TaskManager.Run());
7: base.ProcessRecord();
8: }
9: }
运行这个Cmdlet,多次运行,以及关掉PS后,重新加载后执行的情况来看,我们可以看出:Cmdlet所在程序集从Add-PSSnapIn加载到PowerShell里后,也就是这个DLL被启动起来了,直到这个PowerShell被关掉,完成它的一个生命周期.也就是说,在这运行过程中,我们可以把很多数据记录在静态成员里面,比如说运行的记录等.
PowerShell是微软最新推出的基于脚本的管理工具,用脚本管理的好处就是便于写批处理命令.相象一下大的IT公司里面要把数千台的服务器上的没有响应的IIS重启一下,那是一种多么大的工作量,有了PowerShell后,那就显得轻松很多了,先一个命令查出哪台没有响应了,再发送重启命令,一切都可以自动化地完成.同时容易适应不断变化着的意外情况可以轻松地调整脚本.
因为工作需要,开始学习和使用PoswerShell来做应用开发.目标是把当前的一些功能封装成cmdlet(command-let小命令),同时研究如何在C#里面去调用cmdlet.先看看资源:
PowerShell的下载地址:http://www.microsoft.com/windowsserver2003/technologies/management/powershell/download.mspx
请注意你当前的系统以及CPU类型选择下载.
微软的PowerShell官方BLOG:http://blogs.msdn.com/powershell/
MSDN中的相应说明:http://msdn2.microsoft.com/en-us/library/aa139691.aspx
开发的时候,需要PowerShell的SDK,可以从这里下载(现在只有for vista的):http://www.microsoft.com/downloads/details.aspx?FamilyId=C2B1E300-F358-4523-B479-F53D234CDCCF&displaylang=en (SDK又是那种先下个小文件再下大文件的那种,比较郁闷)
再看一眼传说中的PowerShell,和原来的CMD很像:
输入help就可以看到所有的命令,包含CMD的命令和一些cmdlet,不过就这些就够我们翻一会儿了.
先写到这里,其它的在下面的日子里,会渐渐地写完.
安装完windows Vista SDK后,终于可以开始CmdLet的开发了.如果安装了Samples的同学,可以直接去看示例:X:\Program Files\Microsoft SDKs\Windows\v6.0\Samples\SysMgmt\WindowsPowerShell 其中X是PS所在的安装盘.下面让偶手把手地说一下该怎么建立一个CmdLet吧:
1.打开VS2005,创建一个windows的运行库.
2.添加引用:C:\Program Files\Reference Assemblies\Microsoft\WindowsPowerShell\v1.0\System.Management.Automation.dll
3.新建一个类文件,同时
using System.Management.Automation;
using System.ComponentModel;(这个在安装时会用到)
4.下面开始写代码了:
//先来完成cmdlet的实体类
[Cmdlet(VerbsCommon.Get, "HelloWorld")] //大胆地猜测一下,PS在加载cmdlet程序集的时候,是用反射的方式来识别的,反射的时候就是靠这个attribute来实现,这里面有两个参数,第一个是动作,后一个是名字.这是cmdlet的命名方式:动词+名词
public class ExecuteShell : Cmdlet // 继承自cmdlet的基类
{
private string argus;
[Parameter(Position = 0)] //大家可以发现很有意思在这里面,随处都可以看到attribute,这里指写了第一个参数,直接就反射到类对应的属性上了.
[ValidateNotNullOrEmpty]
public string Args
{
get { return argus; }
set { argus = value; }
}
protected override void ProcessRecord()
//处理请求,我们我这里只是简单地输出一下信息.
{
if (argus != null && argus.Length > 0)
{
WriteCommandDetail("Hello World:" + argus);
}
}
}
//再来看看cmdlet的安装类
[RunInstaller(true)] //又是这种attribute
public class HelloWordSnapIn: PSSnapIn
{
/// <summary>
/// Create an instance of the GetProcPSSnapIn01
/// </summary>
public PSclient()
: base()
{
}
/// <summary>
/// Get a name for this PowerShell snap-in. This name will be used in registering
/// this PowerShell snap-in.
/// 注意这里面的名字最为重要在下面将要讲到
/// </summary>
public override string Name
{
get
{
return "HelloWordSnapIn";
}
}
/// <summary>
/// Vendor information for this PowerShell snap-in.
/// </summary>
public override string Vendor
{
get
{
return "BrainIron";
}
}
/// <summary>
/// Gets resource information for vendor. This is a string of format:
/// resourceBaseName,resourceName.
/// </summary>
public override string VendorResource
{
get
{
return "HelloWordSnapIn,BrainIron";
}
}
/// <summary>
/// Description of this PowerShell snap-in.
/// </summary>
public override string Description
{
get
{
return "This is a PowerShell snap-in that includes the Get-HelloWorld cmdlet. this is a demo, design by Brian";
}
}
}
编译生成:HelloWorldCmdLet.dll
6.这时候该安装了:使用Installutil.exe HelloWorldCmdLet.dll来把安装它.Installutil.exe如果你找不到,那么应该在SDK的BIN目录里面肯定可以找得到.
7.这时候打开PS,使用Get-HelloWorld 命令会发现提示不支持这个命令.这时候要用:Add-PSSnapin HelloWordSnapIn 来把它注册到PS的控制台中,这个命令的后面的那个名字就是我上面说的重要的名字,而不是类名.然后再用Get-HelloWorld 命令就可以看到成果了.
8.调试.因为程序要先注册到PS中,PS才能调用,所以好像不太好调试,其实可以用附加到进程的方式来调试.