星期四, 十月 04, 2007

编写Powershell的HelloWorld的例子,开始编写cmdlet第一步

首先来自Microsoft的例子:http://msdn2.microsoft.com/en-us/library/ms714437.aspx
编译一个以C#语言编写的cmdlet需要的开发环境,可以参看:
http://msdn2.microsoft.com/en-us/library/ms714644.aspx

首先要确认安装了.NET 2.0 Framework的SDK包含csc.exe c#的命令行编译软件。
如果安装成功了.net 2.0 framework SDK,可以在一下目录发现:
C:\WINDOWS\Microsoft.NET\Framework 发现所有安装的.NET Framework的目录。
.Net framework SDK 3.0是在.NET 2.0 SDK的基础上增加了一些新的特性完成的。
所以.NET 3.0自身不带有csc.exe编译软件。
C:\WINDOWS\Microsoft.NET\Framework的典型目录如下。
<dir> v1.0.3705
<dir> v1.1.4322
<dir> v2.0.50727 csc.exe所在目录
<dir> v3.0

其次需要Powershell SDK的安装,如果安装成功可以发现如下目录。
C:\Program Files\Reference Assemblies\Microsoft 发现powershell目录
包含一些.dll 库.

C:\Program Files\Reference Assemblies\Microsoft\WindowsPowerShell\v1.0
2006-09-28 15:49 139,264 Microsoft.PowerShell.Commands.Management.dll
2006-09-28 15:49 294,912 Microsoft.PowerShell.Commands.Utility.dll
2006-09-28 15:49 200,704 Microsoft.PowerShell.ConsoleHost.dll
2006-09-28 15:49 65,536 Microsoft.PowerShell.Security.dll
2006-09-28 15:49 1,564,672 System.Management.Automation.dll

软后编写 用来编译C#的Powershell批处理文件,需要包含命令行编译C#代码的一些参考库
cscc.bat包含内容:

set PS_HOME="C:\Program Files\Reference Assemblies\Microsoft\WindowsPowerShell\v1.0"
csc.exe /reference:%PS_HOME%\Microsoft.PowerShell.Commands.Management.dll,%PS_HOME%\Microsoft.PowerShell.Commands.Utility.dll,%PS_HOME%\Microsoft.PowerShell.ConsoleHost.dll,%PS_HOME%\Microsoft.PowerShell.Security.dll,%PS_HOME%\System.Management.Automation.dll /t:library %1 %2 %3
%1 %2 %3 代表 C#的代码文件.cs文件。

编写HelloWorld的cmdlet步骤。
1.首先编写cmdlet或pscmdlet的子类:
HelloWorld.cs:
using System;
using System.Management.Automation;


[Cmdlet(VerbsCommon.Get, "HelloWorld", SupportsShouldProcess = true)]
public class HelloWorld : PSCmdlet
{

// Called when cmdlet is invoked.
protected override void BeginProcessing()
{
// You could open a database connection here for example.
base.BeginProcessing();
}

// Called when we have pipeline input.
protected override void ProcessRecord()
{
// this.Name could be null in BeginProcessing (no parameters passed)
// but could be filled when ProcessRecord gets called (parameters from pipeline)
try
{
WriteObject("Hello World!");
}catch(Exception)
{

}
}

// Called after every record has been processed.
protected override void EndProcessing()
{
base.EndProcessing();
}

// Called when the user hits CTRL+C
protected override void StopProcessing()
{
base.StopProcessing();
}
}

2.再编写一个Snapin的注册类。
HelloWorldSnapin.cs

using System;
using System.ComponentModel;
using System.Management.Automation;


[RunInstaller(true)]
public class HelloWorldSnapIn : PSSnapIn
{
public override string Name
{
get { return "HelloWorldSnapIn"; }
}

public override string Vendor
{
get { return "William Wang"; }
}

public override string Description
{
get { return "This Windows PowerShell snap-in contains the Get-HelloWorld cmdlet."; }
}
}

3.编译:
set PS_HOME="C:\Program Files\Reference Assemblies\Microsoft\WindowsPowerShell\v1.0"
csc.exe /reference:%PS_HOME%\Microsoft.PowerShell.Commands.Management.dll,%PS_HOME%\Microsoft.PowerShell.Commands.Utility.dll,%PS_HOME%\Microsoft.PowerShell.ConsoleHost.dll,%PS_HOME%\Microsoft.PowerShell.Security.dll,%PS_HOME%\System.Management.Automation.dll /t:library HelloWorld*.cs

得到 HelloWorld.dll文件,然后安装
InstallUtil.exe HelloWorld.dll得到如下成功message:
正在运行事务处理安装。

正在开始安装的“安装”阶段。
查看日志文件的内容以获得 C:\curl-7.16.4\helloworld.dll 程序集的进度。
该文件位于 C:\curl-7.16.4\helloworld.InstallLog。
正在安装程序集“C:\curl-7.16.4\helloworld.dll”。
受影响的参数是:
logtoconsole =
assemblypath = C:\curl-7.16.4\helloworld.dll
logfile = C:\curl-7.16.4\helloworld.InstallLog

“安装”阶段已成功完成,正在开始“提交”阶段。
查看日志文件的内容以获得 C:\curl-7.16.4\helloworld.dll 程序集的进度。
该文件位于 C:\curl-7.16.4\helloworld.InstallLog。
正在提交程序集“C:\curl-7.16.4\helloworld.dll”。
受影响的参数是:
logtoconsole =
assemblypath = C:\curl-7.16.4\helloworld.dll
logfile = C:\curl-7.16.4\helloworld.InstallLog

“提交”阶段已成功完成。

4.然后在powershell里注册这个cmdlet
add-pssnapin helloworldsnapin
如果成功,没有任何提示。


5.运行get-helloworld
得到 hello world!的提示信息。

表明最简单的Hello World cmdlet成功了。