·         PowerShell面向对象编程基础知识总结

1.       PowerShell里面的所有变量和输出都是对象

2.       PowerShell是基于对象的脚本语言。

3.       面向对象的基本概念回顾

类(Class
为物体(或者说是对象)定义的抽象特性,这些特性包括物体的特征(它的属性、域或特性)以及物体的行为(它可以做得事情、方法或操作)。某些人会说类就像是设计图或工厂一样,用来描述某些事物的自然特性。打个比方来说,狗这个类可能包含所有狗包含的共性,例如:品种和皮毛颜色(它们都是狗的特征)、叫和坐下(它们都是狗的行为)。
对象(Object
类的特定实例(Instance)。解释很抽象?对象可以看做是你家的狗,或者你家邻居的狗。无论如何,它们都是狗类的实例。狗类定义一部分所有狗都具有的特性,例如:三条(显然狗主人很喜欢打麻将)是一只真实存在的狗,狗类中的信息就可以用来描述三条与其他狗的不同,三条的皮毛是棕色的。我们可以知道三条被归类为犬科,是狗类的一个实例。
方法(Method
对象的能力。三条是一条狗,它能够叫,因此叫就是三条的方法。三条也许还有其他的方法,例如:原地转圈、作揖、坐下等等。
继承Inheritance
子类是一个类的特殊版本,它继承父类的属性和行为,并引入自己特有的属性和行为狗按照品种划分有很多种,例如:黄金牧羊犬、柯利牧羊犬和吉娃娃。三条是柯利牧羊犬的实例,例如狗类中已经定了了方法叫和属性皮毛颜色。所以每一个狗类的子类都可以直接继承这些信息,不需要额外重新定义这些冗余的信息

 

·         PowerShell中创建对象

o   实例一:创建一个空对象

PS C:Powershell> $pocketknife=New-Object object
PS C:Powershell> $pocketknife
System.Object

 

o   实例二:增加属性(用来描述该对象是什么,只代表该对象有形状,数据即属性)

 

PS C: Powershell> Add-Member -InputObject $pocketknife -Name Color -Value "Red"
-MemberType NoteProperty
PS C:Powershell> $pocketknife

Color
-----
Red

PS C: Powershell> Add-Member -InputObject $pocketknife -Name Weight -Value "55"
-MemberType NoteProperty
PS C:Powershell> $pocketknife | Add-Member NoteProperty Blades 3
PS C:Powershell> $pocketknife | Add-Member NoteProperty Manufacturer ABC
PS C:Powershell> $pocketknife

Color             Weight                Blades                  Manufacturer
-----                                ------                     ------ -                   -----------
Red                55                            3                            ABC

 

 

o   实例三:增加方法(赋予改对象想做什么事情,动作即方法)

 

# 增加一个新方法:
Add-Member -memberType ScriptMethod -In $pocketknife `
-name cut -Value { "I'm whittling now" }
#
指定参数类型增加一个新方法:
Add-Member -in $pocketknife ScriptMethod screw { "Phew...it's in!" }
#
直接通过管道增加一个新方法:
$pocketknife | Add-Member ScriptMethod corkscrew { "Pop! Cheers!" }

 

调用方法:

PS C:Powershell> $pocketknife.cut()
I'm whittling now
PS C:Powershell> $pocketknife.screw()
Phew...it's in!
PS C:Powershell> $pocketknife.corkscrew()
Pop! Cheers!

 

 

如果没有圆括号,则返回方法的基本信息:

PS C:\> $pocketknife.cut

Script              : "I am whittling now"

OverloadDefinitions : {System.Object cut();}

MemberType          : ScriptMethod

TypeNameOfValue     : System.Object

Value               : System.Object cut();

Name                : cut

IsInstance          : True

 

o   实例四:通过类型转换创建对象

PS C:Powershell> $date="1999-9-1 10:23:44"
PS C:Powershell> $date.GetType().fullName
System.String
PS C:Powershell> $date
1999-9-1 10:23:44
PS C:Powershell> [DateTime]$date="1999-9-1 10:23:44"
PS C:Powershell> $date.GetType().FullName
System.DateTime
PS C:Powershell> $date

199991 10:23:44

 

·         PowerShell中调用静态方法

 

o   概述:PowerShell将信息存储在对象中,每个对象有一个具体的类型,简单的文本以system. String类型存储,日期以System.datetime类型存储;任何对象可以通过GetType()方法返回它的类型,并使用full name属性查看类型的完整名称;

 

o   实例一:返回“get-date”的类型

PS C:\> $date=Get-Date

PS C:\> $date

Tuesday, May 5, 2015 10:30:31 AM

PS C:\> $date.GetType().fullname

System.DateTime

 

o   实例二:返回“get-date”的类型支持的所有静态方法,通过方括号和类型名称得到类型对象本身

PS C:Powershell> [System.DateTime] | Get-Member -static -memberType *Method

TypeName: System.DateTime

Name            MemberType    Definition
----            ---------- ----------
Compare          Method           static int Compare(System.DateTime t1, System.Dat...
DaysInMonth Method           static int DaysInMonth(int year, int month)

 

………………

o   实例三:使用System.DateTime类的静态方法Parse将一个字符串转换成DateTime类:

PS C:Powershell> [System.DateTime]::Parse("2012-10-13 23:42:55")

20121013 23:42:55

 

o   实例四:使用System.DateTime类的静态方法IsLeapYear()判断闰年

 

#1988年是闰年吗?
[System.DateTime]::IsLeapYear(1988)
#
打印19882000年的所有闰年
for($year=1988;$year -le 2000;$year++)
{
    if( [System.DateTime]::IsLeapYear($year) ){$year}
}

True
1988
1992
1996
2000

 

o   实例五:使用Math类的静态方法来求绝对值,三角函数,取整;

PS C:Powershell> [Math]::Abs(-10.89)
10.89
PS C:Powershell> [Math]::Sin([Math]::PI/2)
1
PS C:Powershell> [Math]::Truncate(2012.7765)
2012

 

o   实例六:PowerShell中显示对象的实例方法

 

   TypeName: System.RuntimeType

 

Name                           MemberType             Definition

----                           ---------- ----------

AsType                         Method                         type AsType()

Clone                          Method                           System.Object Clone(), System.Objec...

Equals                         Method                          bool Equals(System.Object obj), boo...

FindInterfaces                 Method                  type[] FindInterfaces(System.Reflec...

FindMembers                    Method                System.Reflection.MemberInfo[] Find...

GetArrayRank                   Method                int GetArrayRank(), int _Type.GetAr...

GetConstructor                 Method                System.Reflection.ConstructorInfo G...

GetConstructors                Method               System.Reflection.ConstructorInfo[]...

GetCustomAttributes            Method        System.Object[] GetCustomAttributes...

GetCustomAttributesData        Method     System.Collections.Generic.IList[Sy...

GetDeclaredEvent               Method            System.Reflection.EventInfo GetDecl...

GetDeclaredField               Method             System.Reflection.FieldInfo GetDecl...

 

·         PowerShell中使用.NET基类

 

o   实例一:访问INT类型的(两个静态属性MaxValue,MinValue

只有Get方法,没有Set方法,表示该属性为只读属性

 

PS C:\> [int]|Get-Member -static | out-string -width 80

   TypeName: System.Int32

 

Name            MemberType            Definition

----            ---------- ----------

Equals          Method                        static bool Equals(System.Object objA, System.Obje...

Parse           Method                          static int Parse(string s), static int Parse(strin...

ReferenceEquals Method             static bool ReferenceEquals(System.Object objA, Sy...

TryParse        Method                      static bool TryParse(string s, [ref] int result), ...

MaxValue        Property                  static int MaxValue {get;}

MinValue        Property                    static int MinValue {get;}

 

 

 

PS C:\> [int]::MaxValue

2147483647

PS C:\> [int]::MinValue

-2147483648

 

o   实例二:.NET类型中的,对象类型转换;

使用System.Net.IPAddress类将字符串IP地址转换成一个IPAddress实例

PS C:Powershell> [Net.IPAddress]'10.3.129.71'

Address            : 1199637258
AddressFamily      : InterNetwork
ScopeId            :
IsIPv6Multicast    : False
IsIPv6LinkLocal : False
IsIPv6SiteLocal : False
IPAddressToString : 10.3.129.71

 

o   实例三:.NET类型中的,根据IP地址查看主机名,调用静态的方法

‘8.8.8.8’是谷歌的免费DNS服务器

PS C:\> [system.Net.Dns]::GetHostByAddress('8.8.8.8') | fl

HostName    : google-public-dns-a.google.com

Aliases     : {}

AddressList : {8.8.8.8}

 

o   实例四:.NET类型中的,使用$webclient类的downloadFile方法下载文件

PS C:\> $localName="d:\Powershellindex.htm"

PS C:\> Test-Path $localName

False

PS C:\> $add="http://www.jb51.net/article/55613.htm"

PS C:\> $webClient=New-Object Net.WebClient

PS C:\> $webClient.DownloadFile($add,$localName)

PS C:\> Test-Path $localName

True

 

-          Open the file "d:\Powershellindex.htm" to have a check;

 

实例五:.NET类型中的,查看程序集

 

.NET中的类型定义在不同的程序集中;

首先得知道当前程序已经加载了那些程序集。AppDomain类可以完成这个需求,因为它有一个静态成员CurrentDomainCurrentDomain中有一个GetAssemblies()方法

 

PS C:Powershell> [AppDomain]::CurrentDomain

FriendlyName : DefaultDomain
Id : 1
ApplicationDescription :
BaseDirectory : C:\WINDOWS\system32\WindowsPowerShell\v1.0
DynamicDirectory :
RelativeSearchPath :
SetupInformation : System.AppDomainSetup
ShadowCopyFiles : False

PS C:Powershell> [AppDomain]::CurrentDomain.GetAssemblies()

GAC Version Location
--- ------- --------
True v2.0.50727 C:WindowsMicrosoft.NETFrameworkv2.0.50727mscorlib...
True v2.0.50727 C:WindowsassemblyGAC_MSILMicrosoft.PowerShell.Cons...

 

查询每个程序集中的方法可是使用GetExportedTypes() 方法。因为许多程序集中包含了大量的方法,在搜索时最好指定关键字。下面的代码演示如何查找包含”environment”关键字的类型

 

PS C:Powershell> [AppDomain]::CurrentDomain.GetAssemblies() | ForEach-Object { $_.GetExportedTypes() } | Where-Object { $_ -like $searchtext } | ForEach-Object { $_.FullName }

System.EnvironmentVariableTarget
System.Environment
System.Environment+SpecialFolder

 

例如System.Environment中的属性输出当前登录域、用户名、机器:

 

PS C:Powershell> [Environment]::UserDomainName
MyHome
PS C:Powershell> [Environment]::UserName
xiaoming
PS C:Powershell> [Environment]::MachineName
LocalHost

 

实例六:.NET类型中的,加载程序集

 

自定义一个简单的C#类库编译为Test.dll

wKiom1VIaKizpk2mAAG7loa-AS8723.jpg

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;

namespace Test
{
    public class Student
    {
        public string Name { set; get; }
        public int Age { set; get; }
        public Student(string name, int age)
        {
            this.Name = name;
            this.Age = age;
        }
        public override string  ToString()
        {
            return string.Format("Name={0};Age={1}", this.Name,this.Age);
        }
    }
}

 

编译生成test.dll文件,并copyc:\powershell 目录;

Powershell中加载这个dll并使用其中的Student类的构造函数生成一个实例,最后调用ToString()方法

 

PS C:\Powershell> ls .Test.dll

    目录: C:Powershell

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---         2012/1/13     10:49       4608 Test.dll

PS C:\Powershell> $TestDLL=ls .Test.dll
PS C:\Powershell> [reflection.assembly]::LoadFile($TestDLL.FullName)

GAC    Version        Location
---    -------        --------
False  v2.0.50727     C:\PowershellTest.dll

PS C:\Powershell> $stu=New-Object Test.Student('Mosser',22)
PS C:\Powershell> $stu

Name                                                                        Age
----                                                                        ---
Mosser                                                                       22

PS C:\Powershell> $stu.ToString()
Name=Mosser;Age=22

 

调试:

Step1: copy test.dll test.pdbc:\powershell

Step 2: Open VS, and open the project, and add the breakpoint

wKioL1VIaiqigkkhAAG0sFEnYUQ401.jpg

Step 3: open VS,  navigate to debug – attach to process

wKiom1VIaMbxUiYwAAEC6hxUVmc067.jpg

 

Step 4: run the following command , then debug it.

PS C:\Powershell> ls .Test.dll

    目录: C:Powershell

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---         2012/1/13     10:49       4608 Test.dll

PS C:\Powershell> $TestDLL=ls .Test.dll
PS C:\Powershell> [reflection.assembly]::LoadFile($TestDLL.FullName)

GAC    Version        Location
---    -------        --------
False  v2.0.50727     C:\PowershellTest.dll

PS C:\Powershell> $stu=New-Object Test.Student('Mosser',22)
PS C:\Powershell> $stu

Name                                                                        Age
----                                                                        ---
Mosser                                                                       22

PS C:\Powershell> $stu.ToString()
Name=Mosser;Age=22

 

·         PowerShell中调用COM对象

o   实例一:查看可用的COM对象

每一个COM对象都有存储在注册表中的唯一标识符,遍历访问可以得COM对象,可以直接访问注册表;

 

PS C:\ > dir registry::HKEY_CLASSES_ROOT\CLSID -include PROGID -recurse | foreach {$_.GetValue("")}

file

StaticMetafile

StaticDib

clsid

objref

ADODB.Command.6.0

ADODB.Parameter.6.0

ADODB.Connection.6.0

ADODB.Recordset.6.0

ADODB.Error.6.0

ADODB.ErrorLookup.6.0

ADODB.Record.6.0

ADODB.Stream.6.0

 

常用的COM对象中有

WScript.Shell,
WScript.Network,
Scripting.FileSystemObject,
InternetExplorer.Application,
Word.Application,
Shell.Application

 

o   实例二:使用的COM对象,创建快捷方式

 

WScript.ShellWshShell对象的ProgID,创建WshShell对象可以运行程序、操作注册表、创建快捷方式、访问系统文件夹、管理环境变量

(详解:参考http://baike.baidu.com/link?url=e6Kx8LMzP_uMQYXZy2Cp0loxpdftg1TZg6MzlM91T8n1eHU0n22eKnk0o331-2f52nFH0RaFECbCR_neCGzjaq

 

 

    # Create desktop shortcuts

 

    $wshell = new-object -com WScript.Shell;

    # Notepad++

    $shortCut =           $wshell.CreateShortcut("$env:SystemDrive\Users\Public\Desktop\Notepad++.lnk");

    $shortCut.TargetPath = "$toolsFolder\GreenTools\notepad++\Notepad++.exe"

    $shortCut.WindowStyle = 3;

    $shortCut.WorkingDirectory = "$toolsFolder\GreenTools\notepad++\localization"

    $shortCut.Description = "Open Notepad++"

$shortCut.Save();

 

示例:

 

1

2

3

Set WshShell = CreateObject("WScript.Shell")

WshShell.RegDelete "HKCU\ScriptEngine\Value" '删除值"Value"

WshShell.RegDelete "HKCU\ScriptEngine\Key" '删除键"Key"

 

 

 

参考:

http://www.jb51.net/article/56225.htm

http://www.jb51.net/article/55613.htm

http://www.jb51.net/article/55896.htm

http://www.3fwork.com/a113/000182MYM013863/

http://baike.baidu.com/link?url=e6Kx8LMzP_uMQYXZy2Cp0loxpdftg1TZg6MzlM91T8n1eHU0n22eKnk0o331-2f52nFH0RaFECbCR_neCGzjaq