17. PowerShell -- 面向对象,查看加载程序集,COM对象

·         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对象可以运行程序、操作注册表、创建快捷方式、访问系统文件夹、管理环境变量。

(详解:参考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

时间: 2024-11-29 09:29:16

17. PowerShell -- 面向对象,查看加载程序集,COM对象的相关文章

C# 动态加载程序集信息

在设计模式的策略模式中,需要动态加载程序集信息,本文通过一个简单的实例,来讲解动态加载Dll需要的知识点. 涉及知识点: AssemblyName类,完整描述程序集的唯一标识, 用来表述一个程序集. Assembly类,在System.Reflection命名空间下,表示一个程序集,它是一个可重用.无版本冲突并且可自我描述的公共语言运行时应用程序构建基块. Module类 表述在模块上执行反射,表述一个程序集的模块信息. Type类,在System命名空间下,表示类型声明:类类型.接口类型.数组

iis7+的虚拟目录:未能加载程序集“**”。请确保在访问该页之前已经编译了此程序集

在使用win8系统后,突然想运行iis,于是在windows组件中启用iis,并aspnet_regiis.exe -i注册iis后,于是开始发布了一个站点,一切正常 继而,在该站点下添加虚拟目录,然后预览虚拟目录的网页,就会立刻报类似“未能加载程序集“App_Web_utohcdb4”.请确保在访问该页之前已经编译了此程序集.”的错误 我纳闷了,我记得在以前版本的iis上建立一个虚拟目录是何其的简单并且不会出错,搜索后发现,原来右击网站,有了两个选下个“添加应用程序”和“添加虚拟目录” 继续搜

CLR如何加载程序集以及程序集版本策略

在项目的配置文件Web.config中,会看到<runtime>节点,以及包含在其中的<assemblyBinding>节点,这显然与程序集有关,这些节点到底何时被用到呢? 在默认情况下,在运行时,JIT编译器将IL代码编译成本地代码时,会查看IL代码中的字段.局部变量.方法参数等引用了哪些类型,然后借助程序集的TypeRef和AssemblyRef元数据,内部使用System.Reflection.Assembly的Load方法来确定需要被加载的程序集,包括module. Loa

C# 动态加载程序集dll (实现接口)

一.程序集(接口程序集):LyhInterface.Dll namespace LyhInterface{    public interface ILyhInterface    {        void Run();    }} 二.程序集(实现接口的程序集):LyhClassLibrary1.dll, LyhClassLibrary2.dll,LyhClassLibrary3.dll,所有程序集引用:LyhInterface.dll namespace LyhClassLibrary1{

C#在使用Assembly加载程序集时失败

错误现象: 进行插件读取时出现错误:"尝试从一个网络位置加载程序集,在早期版本的 .NET Framework 中,这会导致对该程序集进行沙盒处理.此发行版的 .NET Framework 默认情况下不启用 CAS 策略,因此,此加载可能会很危险.如果此加载不是要对程序集进行沙盒处理,请启用 loadFromRemoteSources 开关.有关详细信息,请参见 http://go.microsoft.com/fwlink/?LinkId=155569." 错误原因:由于在项目中引用了

未能加载程序集System.EnterpriseServices.Wrapper.dll

1.使用CMD命令行 copy C:WINDOWS\Microsoft.NET \Framework\v2.0.50727\System.EnterpriseServices.Wrapper.dll C:WINDOWS\Assebmly\GAC_32\System.EnterpriseServices\2.0.0.0_b03f5f7f11d50a3a copy C:WINDOWS\Microsoft.NET \Framework\v2.0.50727\System.EnterpriseServi

Assembly.LoadFrom加载程序集类型转换失败解决方法

为了让我的wcf模块框架支持自定义通道上下文,对代码又进行了一次小型的重构,测试时发现类型转换的错误,最后发现是loadfrom引起的.如果向 loadfrom 上下文中加载了一个程序集,则将激活 loadfromcontext 托管调试助手 (mda).因为默认时加载程序集是在defaul上下文的,所以就算是同一个程序集里,因上下文不同,类型也不同了,所以转换失败.最后用assembly.loadfile来解决了此问题. 假设: a.dll 中有一个接口 interface ab.dll 中有

MVC中未能加载程序集System.Web.Http/System.Web.Http.WebHost

需要检查项目的Microsoft.AspNet.WebApi版本是否最新,System.Web.Http 这个命名空间需要更新WebApi版本. 报错:未能加载程序集 System.Web.Http/System.Web.Http.WebHost NuGet>程序包管理器控制台:没有的话,需要安装:Install-Package Microsoft.AspNet.WebApi有的话,需要更新:Update-Package Microsoft.AspNet.WebApi -reinstall原因:

wpf无法加载程序集的元数据 可能已从web下载

wpf无法加载程序集的元数据 可能已从web下载     别人写的wpf程序,源代码放到自己电脑上,设计器加载出现问题:无法加载程序集“ChwareStudio.MetaModel”的元数据. 解决方案,只需要对你所引用或者额外加载的dll文件进行“接触锁定”操作就行了. 解除锁定步骤:找到你的dll->右键属性->通用选项卡->解除锁定即可.