Windows PowerShell***的功能之一就是它对.NET对象模式的直接访问。不幸的是,由于我不是开发人员,且大部分编程概念对我来说也很陌生,这是我在学习PowerShell时***的障碍。
在我最初用PowerShell工作时,我不知道类别、端口、构造或成员的不同,对对象的概念(来自一个程序员的观点)也不是真得了解。但我确实认为这些概念对学习和使用有Windows PowerShell的.NET很重要。我还发现,了解一些C#(或至少能读懂它)也非常有帮助。
因此,我将试着通过举例来简短地解释下这些概念并在这个过程中提供一些代码来帮助你。我还会试着(用我有限的能力)来提供一些C# PowerShell转换的基本指导。
让我们从定义开始。此外,如果你是一个开发人员,对于我接下来说的所有事情都请随意发表意见。这些定义都是我对于这些概念推导出来的意见。
.NET:它是有黑箱代码的架构,这些代码接受特定的输入并返回一个值或对象。基本上,微软为你完成了所有编码——你只须要正确调用它。MSDN是.NET架构的无价资源。
类别(Class):我在.NET中提及的几乎所有事情都是一个类别。我倾向于认为一个类别是一个样板,示范对象应该是什么样子和它应该有什么特性和类函数。举例来说,一个Microsoft.Win32.RegistryKey对象应该有命名特性和GetValue方法。
成员(Member):每个类别都有成员,它们是连结起来的特性和类函数。如果你只想看看一个类别必须提供物的概况,这会是个好地方。
特性(Property):特性是类别两类成员之一。简言之,可以认为它们是对象的属性。举例来说,Microsoft.Win32.RegistryKey类别有Name、SubKeyCount和Value Count等特性,所以每个Microsoft.Win32.RegistryKey对象都能有这些特性。
类函数(Method):类函数是类别两类成员之一。和特性一样,类函数也由类别限制,但是和属性相反,它们更像类别的功能。Microsoft.Win32.RegistryKey类别有CreateSubKey、DeleteSubkey、SetValue等类函数。和特性一样,每个Microsoft.Win32.RegistryKey对象都能有这些类函数。
构造函数(Constructor):构造函数是类别的一个类函数,它收集创建一个类别实例所需的信息。我更喜欢将构造定义为使对象有用所需的信息或对象。用System.Data.SqlClient.SqlCommand来举例,有四个不同方法可以让你从该类中创建一个对象。每一方法创建出的对象都有些微不同的数据。
静态域(Static field):它们和特性相似,但无须创建对象实例就可以获得。在PowerShell中,访问静态成员确实简单。你所要做的就是运用
[.NET Class]::StaticField。
在接下来的例子中,.NET类别System.Math会返回PI值:
[System.Math]::PI.
静态类函数(Static method):它们就像类函数,但无须创建对象实例就可获得。和你访问静态域的方式相似,你只须运用[.NET Class]::StaticMethods。
接下来的例子中,Microsoft.Win32.RegistryKey将为一个叫做MyServer的远程机返回Microsoft.Win32.RegistryKey对象。
[Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine,”MyServer”)
现在我们已经涵盖了基本的.NET框架,让我们详细检查下某些PowerShell特性,如创建类别并发现这些类别可得到哪些特性和类函数。
新对象(New-Object),创建微软.NET框架或COM对象的实例。
接下来的例子中我会创建一个System.DirectoryServices.ActiveDirectory.DirectoryContext实例:
$Context = new-object System.DirectoryServices.ActiveDirectory.DirectoryContext("DirectoryServer",$Name)
获取成员(Get-Member),访问对象的特性和类函数。
接下来的例子将返回$Context对象的所有成员:
$Context | Get-Member
收集所有.NET问题
以下是工作中的.NET实例。它运用新对象、构造函数和静态类函数返回活动目录域控制器对象。
function Get-DC { Param($Name,$Domain) if($Name) { $Context = new-object System.DirectoryServices. ActiveDirectory.DirectoryContext("DirectoryServer",$Name)
[System.DirectoryServices.
ActiveDirectory.DomainController]
::GetDomainController($Context)
}
if($Domain)
{
$Context = new-object
System.DirectoryServices.
ActiveDirectory.DirectoryContext
("Domain",$Domain)
[System.DirectoryServices.ActiveDirectory.
DomainController]::FindAll($Context)
}
if(!$Name -and !$Domain)
{
$DCName = ([adsi]"LDAP://rootDSE")
.dnsHostname.ToString()
$Context = new-object
System.DirectoryServices.ActiveDirectory.
DirectoryContext("DirectoryServer",$DCName)
[System.DirectoryServices.ActiveDirectory.
DomainController]::GetDomainController($Context)
}
}
【编辑推荐】