<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>PowerShell</title><link>http://webuc.net/chinahuman/category/486.aspx</link><description>PowerShell</description><managingEditor>铁匠</managingEditor><dc:language>af</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>铁匠</dc:creator><title>Cmdlet的配置以及输出的格式化</title><link>http://webuc.net/chinahuman/archive/2007/10/22/9553.aspx</link><pubDate>Mon, 22 Oct 2007 21:57:00 GMT</pubDate><guid>http://webuc.net/chinahuman/archive/2007/10/22/9553.aspx</guid><wfw:comment>http://webuc.net/chinahuman/comments/9553.aspx</wfw:comment><comments>http://webuc.net/chinahuman/archive/2007/10/22/9553.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://webuc.net/chinahuman/comments/commentRss/9553.aspx</wfw:commentRss><trackback:ping>http://webuc.net/chinahuman/services/trackbacks/9553.aspx</trackback:ping><description>&lt;p&gt;cmdlet虽然编译后是一个程序集,但是它内嵌于powershell.exe中运行,所以它的配置文件用app.config就不太适合了,得用powershell.exe.config,发现原来没有,就自己加一个过去,改个名就可以了.&lt;/p&gt; &lt;p&gt;今天碰到一个让人狂晕的问题,那就是明明在配置文件里面加了配置项了,但是在程序里面死活读不到,于是到处找,因为之前已经给cmdlet加了config,并给里面配置了一个connectionstring,但是这次加的两个appsetting不生效.最后发现那个修改的文件的最后修改日期还是停在了上次的时间,并没有更新过来,但是打开文件的时候,又可以看到完整内容.一个比较恐怖的念头出现了,那就是系统不知道用了什么策略为了保护windows目录下面的文件,不能去写文件,只能够用覆盖的方式来实现。（我的机器是Vista，发现所有的Windows等核心目录里面自己弄的文件全放在%userprofile%\AppData\Local\VirtualStore\目录下，估计这是为了保护系统，以及为了能比较好地恢复系统吧）。&lt;/p&gt; &lt;p&gt;Cmdlet在使用的时候，可以用$v=cmdlet 这种方式把cmdlet的输出保存给变量，特别是输出的是对象或是列表的时候，这样获取值还可以传给后面cmdlet的继续使用.在为了把输出的对象列表格式发成一个表格的时候，花了偶N多时间，因为系统提供的例子是Get-Process这个例子，得到的进程列表信息输出的时候，不用任何的操作就可以直接输出成一个列表，但是自己写的对象，死活以一种不专业的形态输出来：属性名：值 这样一行一行地输出来。开始我总觉得是对象实现了某一个接口或是某个attribute起了作用，自己尝试去实现这些，可是就是不行。最后突然想到了powershell目录下面的那些ps1xml文件，拿editplus打开它们，发现原来这些会自动列表的对象在这里面都定义好了每个字段可以显示成什么名字，以及列宽什么的。因为没有时间了，所以只好先在输出的时候用format-table这个管道来格式化成列表，以后再研究怎么修改这些ps1xml。&lt;/p&gt; &lt;p&gt;现在感觉有两个地方让人不爽了，一个就是配置文件不能随着cmdlet的plugin文件走，另一个就是对象列表的说明还要自己搞ps1xml来描述，这对于cmdlet的分发造成了不便。这东西给别人用的时候，只好写上把config和原来的合并一下，把ps1xml复制到运行目录上。在MSDN里面有看到一个make-shell命令，但是本机运行的时候，没有发现这个命令，GOOGLE的时候，发现那是UNIX上的。&lt;/p&gt;&lt;img src ="http://webuc.net/chinahuman/aggbug/9553.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>铁匠</dc:creator><title>PowerShell的Cmdlet的生存周期和执行顺序</title><link>http://webuc.net/chinahuman/archive/2007/09/24/9501.aspx</link><pubDate>Mon, 24 Sep 2007 15:17:00 GMT</pubDate><guid>http://webuc.net/chinahuman/archive/2007/09/24/9501.aspx</guid><wfw:comment>http://webuc.net/chinahuman/comments/9501.aspx</wfw:comment><comments>http://webuc.net/chinahuman/archive/2007/09/24/9501.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://webuc.net/chinahuman/comments/commentRss/9501.aspx</wfw:commentRss><trackback:ping>http://webuc.net/chinahuman/services/trackbacks/9501.aspx</trackback:ping><description>&lt;P&gt;认清了Cmdlet的生存周期和执行的顺序对于我们后续的开发和使用有相当重要的意义，因为它直接决定了到时候该怎么开发，能实现哪些功能（比如说一直需要运行的程序，就不适合用Cmdlet来完成）。&lt;/P&gt;
&lt;DIV class=csharpcode&gt;
&lt;P&gt;先让我们看一下Cmdlet的生存周期:&lt;PRE&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt; [Cmdlet(VerbsCommon.Add, &lt;SPAN class=str&gt;"Test"&lt;/SPAN&gt;)] &lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; AddTest: Cmdlet&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;protected&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;override&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; BeginProcessing()&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;        {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;            WriteObject(&lt;SPAN class=str&gt;"BeginProcessing"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;        }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   9:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  10:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;protected&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;override&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; ProcessRecord()&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  11:  &lt;/SPAN&gt;        {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  12:  &lt;/SPAN&gt;            WriteObject(&lt;SPAN class=str&gt;"ProcessRecord"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  13:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;base&lt;/SPAN&gt;.ProcessRecord();&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  14:  &lt;/SPAN&gt;        }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  15:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  16:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;protected&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;override&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; EndProcessing()&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  17:  &lt;/SPAN&gt;        {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  18:  &lt;/SPAN&gt;            WriteObject(&lt;SPAN class=str&gt;"EndProcessing"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  19:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;base&lt;/SPAN&gt;.EndProcessing();&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  20:  &lt;/SPAN&gt;        }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  21:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  22:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;protected&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;override&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; StopProcessing()&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  23:  &lt;/SPAN&gt;        {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  24:  &lt;/SPAN&gt;            WriteObject(&lt;SPAN class=str&gt;"StopProcessing"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  25:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;base&lt;/SPAN&gt;.StopProcessing();&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  26:  &lt;/SPAN&gt;        }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  27:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  28:  &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;PRE&gt;我们可以发现，结果是：&lt;/PRE&gt;
&lt;P&gt;BeginProcessing&lt;BR&gt;ProcessRecord&lt;BR&gt;EndProcessing 
&lt;P&gt;基本上和我们猜测的一样的，初始化，执行，完成 
&lt;P&gt;可以判断StopProcessing这是在Cmdlet被中止的时候才会触发的。&lt;/P&gt;
&lt;P&gt;再让我们看一下Cmdlet的生存周期:&lt;/P&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; TaskManager&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;static&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;int&lt;/SPAN&gt; runCount = 0;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;static&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;int&lt;/SPAN&gt; Run()&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;        { &lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; runCount ++;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;        }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;    [Cmdlet(VerbsCommon.Add, &lt;SPAN class=str&gt;"Test"&lt;/SPAN&gt;)] &lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; AddTest: Cmdlet&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;protected&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;override&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; ProcessRecord()&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;        {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;            WriteObject(TaskManager.Run());&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;base&lt;/SPAN&gt;.ProcessRecord();&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;        }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   9:  &lt;/SPAN&gt;    }&lt;/PRE&gt;运行这个Cmdlet，多次运行，以及关掉PS后，重新加载后执行的情况来看，我们可以看出：Cmdlet所在程序集从Add-PSSnapIn加载到PowerShell里后,也就是这个DLL被启动起来了,直到这个PowerShell被关掉,完成它的一个生命周期.也就是说,在这运行过程中,我们可以把很多数据记录在静态成员里面,比如说运行的记录等.&lt;/DIV&gt;
&lt;STYLE type=text/css&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/STYLE&gt;

&lt;STYLE type=text/css&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/STYLE&gt;
&lt;/DIV&gt;&lt;/DIV&gt;
&lt;STYLE type=text/css&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/STYLE&gt;&lt;img src ="http://webuc.net/chinahuman/aggbug/9501.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>铁匠</dc:creator><title>PowerShell的CmdLet开发的HelloWorld</title><link>http://webuc.net/chinahuman/archive/2007/09/18/9483.aspx</link><pubDate>Tue, 18 Sep 2007 09:32:00 GMT</pubDate><guid>http://webuc.net/chinahuman/archive/2007/09/18/9483.aspx</guid><wfw:comment>http://webuc.net/chinahuman/comments/9483.aspx</wfw:comment><comments>http://webuc.net/chinahuman/archive/2007/09/18/9483.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://webuc.net/chinahuman/comments/commentRss/9483.aspx</wfw:commentRss><trackback:ping>http://webuc.net/chinahuman/services/trackbacks/9483.aspx</trackback:ping><description>&lt;p&gt;安装完windows Vista SDK后,终于可以开始CmdLet的开发了.如果安装了Samples的同学,可以直接去看示例:X:\Program Files\Microsoft SDKs\Windows\v6.0\Samples\SysMgmt\WindowsPowerShell 其中X是PS所在的安装盘.下面让偶手把手地说一下该怎么建立一个CmdLet吧:&lt;/p&gt; &lt;p&gt;1.打开VS2005,创建一个windows的运行库.&lt;/p&gt; &lt;p&gt;2.添加引用:C:\Program Files\Reference Assemblies\Microsoft\WindowsPowerShell\v1.0\System.Management.Automation.dll&lt;/p&gt; &lt;p&gt;3.新建一个类文件,同时&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;using System.Management.Automation;&lt;br&gt;using System.ComponentModel;(这个在安装时会用到)&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;4.下面开始写代码了:&lt;/p&gt;&lt;font color="#76c592"&gt;//先来完成cmdlet的实体类&lt;/font&gt;&amp;nbsp;&lt;br&gt; &lt;p&gt;[Cmdlet(VerbsCommon.Get, "HelloWorld")] &lt;font color="#79dfb7"&gt;//大胆地猜测一下,PS在加载cmdlet程序集的时候,是用反射的方式来识别的,反射的时候就是靠这个attribute来实现,这里面有两个参数,第一个是动作,后一个是名字.这是cmdlet的命名方式:动词+名词&lt;/font&gt;&lt;br&gt;public class ExecuteShell : Cmdlet &lt;font color="#76c592"&gt;// 继承自cmdlet的基类&lt;br&gt;&lt;/font&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private string argus;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Parameter(Position = 0)]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#76c592"&gt;//大家可以发现很有意思在这里面,随处都可以看到attribute,这里指写了第一个参数,直接就反射到类对应的属性上了.&lt;/font&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [ValidateNotNullOrEmpty]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Args&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return argus; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set { argus = value; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected override void ProcessRecord()&lt;/p&gt;&lt;font color="#76c592"&gt;//处理请求,我们我这里只是简单地输出一下信息.&lt;/font&gt;&amp;nbsp;&lt;br&gt; &lt;p&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (argus != null &amp;amp;&amp;amp; argus.Length &amp;gt; 0)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WriteCommandDetail("Hello World:" + argus);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }  &lt;p&gt;} &lt;p&gt;&lt;font color="#76c592"&gt;//再来看看cmdlet的安装类&lt;/font&gt;&lt;/p&gt; &lt;p&gt;[RunInstaller(true)] &lt;font color="#76c592"&gt;//又是这种attribute&lt;/font&gt;&lt;/p&gt; &lt;p&gt;public class HelloWordSnapIn: PSSnapIn &lt;br&gt;{&lt;br&gt;&lt;font color="#76c592"&gt;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; /// Create an instance of the GetProcPSSnapIn01&lt;br&gt;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br&gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public PSclient()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : base()&lt;br&gt;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp; } &lt;/p&gt; &lt;p&gt;&lt;font color="#76c592"&gt;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; /// Get a name for this PowerShell snap-in. This name will be used in registering&lt;br&gt;&amp;nbsp;&amp;nbsp; /// this PowerShell snap-in.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#76c592"&gt;&amp;nbsp;&amp;nbsp; /// 注意这里面的名字最为重要在下面将要讲到&lt;br&gt;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; public override string Name&lt;br&gt;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return "HelloWordSnapIn";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp; } &lt;/p&gt; &lt;p&gt;&lt;font color="#76c592"&gt;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; /// Vendor information for this PowerShell snap-in.&lt;br&gt;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br&gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp; public override string Vendor&lt;br&gt;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return "BrainIron";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp; }  &lt;p&gt;&lt;font color="#76c592"&gt;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; /// Gets resource information for vendor. This is a string of format: &lt;br&gt;&amp;nbsp;&amp;nbsp; /// resourceBaseName,resourceName. &lt;br&gt;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; public override string VendorResource&lt;br&gt;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return "HelloWordSnapIn,BrainIron";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp; }  &lt;p&gt;&lt;font color="#76c592"&gt;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; /// Description of this PowerShell snap-in.&lt;br&gt;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; public override string Description&lt;br&gt;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return "This is a PowerShell snap-in that includes the Get-HelloWorld cmdlet. this is a demo, design by Brian";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;} &lt;p&gt;编译生成:HelloWorldCmdLet.dll&lt;/p&gt; &lt;p&gt;6.这时候该安装了:使用Installutil.exe HelloWorldCmdLet.dll来把安装它.Installutil.exe如果你找不到,那么应该在SDK的BIN目录里面肯定可以找得到.&lt;/p&gt; &lt;p&gt;7.这时候打开PS,使用Get-HelloWorld 命令会发现提示不支持这个命令.这时候要用:Add-PSSnapin&amp;nbsp; HelloWordSnapIn 来把它注册到PS的控制台中,这个命令的后面的那个名字就是我上面说的重要的名字,而不是类名.然后再用Get-HelloWorld 命令就可以看到成果了.&lt;/p&gt; &lt;p&gt;8.调试.因为程序要先注册到PS中,PS才能调用,所以好像不太好调试,其实可以用附加到进程的方式来调试.&lt;/p&gt;&lt;img src ="http://webuc.net/chinahuman/aggbug/9483.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>铁匠</dc:creator><title>PowerShell的开发初步</title><link>http://webuc.net/chinahuman/archive/2007/09/14/9469.aspx</link><pubDate>Fri, 14 Sep 2007 05:33:00 GMT</pubDate><guid>http://webuc.net/chinahuman/archive/2007/09/14/9469.aspx</guid><wfw:comment>http://webuc.net/chinahuman/comments/9469.aspx</wfw:comment><comments>http://webuc.net/chinahuman/archive/2007/09/14/9469.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://webuc.net/chinahuman/comments/commentRss/9469.aspx</wfw:commentRss><trackback:ping>http://webuc.net/chinahuman/services/trackbacks/9469.aspx</trackback:ping><description>&lt;P&gt;PowerShell是微软最新推出的基于脚本的管理工具,用脚本管理的好处就是便于写批处理命令.相象一下大的IT公司里面要把数千台的服务器上的没有响应的IIS重启一下,那是一种多么大的工作量,有了PowerShell后,那就显得轻松很多了,先一个命令查出哪台没有响应了,再发送重启命令,一切都可以自动化地完成.同时容易适应不断变化着的意外情况可以轻松地调整脚本.&lt;/P&gt;
&lt;P&gt;因为工作需要,开始学习和使用PoswerShell来做应用开发.目标是把当前的一些功能封装成cmdlet(command-let小命令),同时研究如何在C#里面去调用cmdlet.先看看资源:&lt;/P&gt;
&lt;P&gt;PowerShell的下载地址:&lt;A title=http://www.microsoft.com/windowsserver2003/technologies/management/powershell/download.mspx href="http://www.microsoft.com/windowsserver2003/technologies/management/powershell/download.mspx"&gt;http://www.microsoft.com/windowsserver2003/technologies/management/powershell/download.mspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;请注意你当前的系统以及CPU类型选择下载.&lt;/P&gt;
&lt;P&gt;微软的PowerShell官方BLOG:&lt;A title=http://blogs.msdn.com/powershell/ href="http://blogs.msdn.com/powershell/"&gt;http://blogs.msdn.com/powershell/&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;MSDN中的相应说明:&lt;A title=http://msdn2.microsoft.com/en-us/library/aa139691.aspx href="http://msdn2.microsoft.com/en-us/library/aa139691.aspx"&gt;http://msdn2.microsoft.com/en-us/library/aa139691.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;开发的时候,需要PowerShell的SDK,可以从这里下载(现在只有for vista的):&lt;A title=http://www.microsoft.com/downloads/details.aspx?FamilyId=C2B1E300-F358-4523-B479-F53D234CDCCF&amp;amp;displaylang=en href="http://www.microsoft.com/downloads/details.aspx?FamilyId=C2B1E300-F358-4523-B479-F53D234CDCCF&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyId=C2B1E300-F358-4523-B479-F53D234CDCCF&amp;amp;displaylang=en&lt;/A&gt;&amp;nbsp;(SDK又是那种先下个小文件再下大文件的那种,比较郁闷)&lt;/P&gt;
&lt;P&gt;再看一眼传说中的PowerShell,和原来的CMD很像:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://webuc.net/images/webuc_net/chinahuman/484/o_WindowsLiveWriter_PowerShell_C7BC_image.png" atomicselection="true"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=153 alt=image src="/images/webuc_net/chinahuman/484/o_WindowsLiveWriter_PowerShell_C7BC_image_thumb.png" width=240 border=0&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;输入help就可以看到所有的命令,包含CMD的命令和一些cmdlet,不过就这些就够我们翻一会儿了.&lt;/P&gt;
&lt;P&gt;先写到这里,其它的在下面的日子里,会渐渐地写完.&lt;/P&gt;&lt;img src ="http://webuc.net/chinahuman/aggbug/9469.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>