· 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
1999年9月1日 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")
2012年10月13日 23:42:55
o 实例四:使用System.DateTime类的静态方法IsLeapYear()判断闰年
#1988年是闰年吗?
[System.DateTime]::IsLeapYear(1988)
#打印1988到2000年的所有闰年
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类可以完成这个需求,因为它有一个静态成员CurrentDomain,CurrentDomain中有一个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:
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文件,并copy到c:\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.pdb到c:\powershell
Step 2: Open VS, and open the project, and add the breakpoint
Step 3: open VS, navigate to debug – attach to process
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.Shell是WshShell对象的ProgID,创建WshShell对象可以运行程序、操作注册表、创建快捷方式、访问系统文件夹、管理环境变量。
)
# 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/
转载于:https://blog.51cto.com/57388/1642081