PowerShell基础教程(13)——创建 .NET 和 COM 对象 (New-Object) <o:p></o:p>
某些软件组件具有 .NET Framework 和 COM 接口,因此可执行许多系统管理任务。Windows PowerShell 允许您使用这些组件,因此,您可以使用 cmdlet 执行这些任务,而不会受到任何限制。在最初版本的 Windows PowerShell 中,多数 cmdlet 不适用于远程计算机。我们将在直接使用 Windows PowerShell 中的 .NET System.Diagnostics.EventLog 类来管理事件日志时,演示如何消除此限制。
使用 New-Object 访问事件日志<o:p></o:p>
.NET Framework 类库包含可用于管理事件日志的名为 System.Diagnostics.EventLog 的类。可以使用具有 TypeName 参数的 New-Object cmdlet 来创建新的 .NET 类实例。例如,以下命令可创建事件日志引用:
PS> New-Object -TypeName System.Diagnostics.EventLog<o:p></o:p>
<o:p> </o:p>
Max(K) Retain OverflowAction Entries Name<o:p></o:p>
------ ------ -------------- ------- ----<o:p></o:p>
|
<o:p> </o:p>
尽管该命令已创建 EventLog 类实例,但该实例并不包含任何数据。这是由于未指定特定的事件日志。如何可获取实际事件日志?
将构造函数与 New-Object 结合使用<o:p></o:p>
若要引用特定的事件日志,则需要指定该日志的名称。New-Object 具有 ArgumentList 参数。对象的特殊启动方法可使用作为值传递到此参数的参数。由于该方法用于构造对象,因此称为构造函数。例如,若要获取对 Application 日志的引用,请将字符串‘Application’指定为参数:
PS> New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application<o:p></o:p>
<o:p> </o:p>
Max(K) Retain OverflowAction Entries Name<o:p></o:p>
------ ------ -------------- ------- ----<o:p></o:p>
16,384 7 OverwriteOlder 2,160 Application<o:p></o:p>
|
<o:p> </o:p>
<!----><!----><!---->请注意: <o:p></o:p>
由于大多数 .NET 核心类包含在系统命名空间中,因此如果 Windows PowerShell 找不到与指定类型名称匹配的项,则将自动尝试查找在系统命名空间中指定的类。这意味着,您可以指定 Diagnostics.EventLog 而不是 System.Diagnostics.EventLog。<o:p></o:p>
您可能需要存储对对象的引用,以便在 Windows PowerShell 会话期间使用它。尽管通过 Windows PowerShell 可对管道执行许多操作,但是,为了减少需要使用的变量数,有时将对象的引用存储在变量中可更方便地对这些对象进行操作。
Windows PowerShell 允许您创建其本质为对象的变量。任何有效的 Windows PowerShell 命令的输出均可存储在变量中。变量名称始终以 $ 开头。若要在名为 $AppLog 的变量中存储对应用程序日志的引用,请键入变量名称、后跟等号,然后键入用于创建应用程序日志对象的命令:
PS> $AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application<o:p></o:p>
|
<o:p> </o:p>
随后,如果键入 $AppLog,则可看到 $AppLog 变量中包含该应用程序日志:
PS> $AppLog<o:p></o:p>
<o:p> </o:p>
Max(K) Retain OverflowAction Entries Name<o:p></o:p>
------ ------ -------------- ------- ----<o:p></o:p>
16,384 7 OverwriteOlder 2,160 Application<o:p></o:p>
|
<o:p> </o:p>
使用 New-Object 访问远程事件日志<o:p></o:p>
前一节中使用的命令主要适用于本地计算机,但 Get-EventLog cmdlet 也可实现相同的功能。若要访问远程计算机上的应用程序日志,则必须将日志名称以及计算机名称(或 IP 地址)作为参数进行提供。
PS> $RemoteAppLog = New-Object -TypeName System.Diagnostics.EventLog Application,192.168.1.81<o:p></o:p>
PS> $RemoteAppLog<o:p></o:p>
<o:p> </o:p>
Max(K) Retain OverflowAction Entries Name<o:p></o:p>
------ ------ -------------- ------- ----<o:p></o:p>
512 7 OverwriteOlder 262 Application<o:p></o:p>
|
<o:p> </o:p>
既然我们已将事件日志的引用存储在 $RemoteAppLog 变量中,那么还可对其执行哪些任务?
对象中经常具有可调用以执行任务的方法。可以使用 Get-Member 来显示与对象关联的方法。以下命令和选定的输出显示了 EventLog 类的其中一些方法:
PS> $RemoteAppLog | Get-Member -MemberType Method<o:p></o:p>
<o:p> </o:p>
<o:p> </o:p>
TypeName:System.Diagnostics.EventLog<o:p></o:p>
<o:p> </o:p>
Name MemberType Definition<o:p></o:p>
---- ---------- ----------<o:p></o:p>
...<o:p></o:p>
Clear Method System.Void Clear()<o:p></o:p>
Close Method System.Void Close()<o:p></o:p>
...<o:p></o:p>
GetType Method System.Type GetType()<o:p></o:p>
...<o:p></o:p>
ModifyOverflowPolicy Method System.Void ModifyOverflowPolicy(Overfl...<o:p></o:p>
RegisterDisplayName Method System.Void RegisterDisplayName(String ...<o:p></o:p>
...<o:p></o:p>
ToString Method System.String ToString()<o:p></o:p>
WriteEntry Method System.Void WriteEntry(String message),...<o:p></o:p>
WriteEvent Method System.Void WriteEvent(EventInstance in...<o:p></o:p>
|
<o:p> </o:p>
使用 Clear() 方法可清除事件日志。在调用方法时,方法名称必须后跟圆括号,即使该方法不需要参数也是这样。这样,Windows PowerShell 可以将方法与可能同名的属性区分开来。键入以下命令可调用 Clear 方法:
PS> $RemoteAppLog.Clear()<o:p></o:p>
|
<o:p> </o:p>
键入以下命令可显示日志。此时,您将看到事件日志已清除,并且该日志中有 0 个而不是 262 个条目:
PS> $RemoteAppLog<o:p></o:p>
<o:p> </o:p>
Max(K) Retain OverflowAction Entries Name<o:p></o:p>
------ ------ -------------- ------- ----<o:p></o:p>
512 7 OverwriteOlder 0 Application<o:p></o:p>
|
<o:p> </o:p>
使用 New-Object 创建 COM 对象<o:p></o:p>
您可以使用 New-Object 来处理组件对象模型 (COM) 组件。组件的范围非常广泛,从 Windows Script Host (WSH) 中包含的各种库到 ActiveX 应用程序,例如大多数系统中所安装的 Internet Explorer。
New-Object 可使用 .NET Framework 运行库可调用包装来创建 COM 对象,因此它具有的限制与在调用 COM 对象时 .NET 具有的限制相同。若要创建 COM 对象,则需要利用要使用的 COM 类的编程标识符或 ProgId 来指定 ComObject 参数。在本教程中,将不对有关 COM 使用限制和确定系统中哪些 ProgId 可用进行完整的讨论,但环境中大多数已知对象(例如 WSH)可以在 Windows PowerShell 中使用。
可以通过指定这些 ProgId 来创建 WSH 对象:WScript.Shell、WScript.Network、Scripting.Dictionary 和 Scripting.FileSystemObject。使用以下命令可创建这些对象:
New-Object -ComObject WScript.Shell<o:p></o:p>
New-Object -ComObject WScript.Network<o:p></o:p>
New-Object -ComObject Scripting.Dictionary<o:p></o:p>
New-Object -ComObject Scripting.FileSystemObject<o:p></o:p>
|
<o:p> </o:p>
尽管这些类的大多数功能可在 Windows PowerShell 中以其他方式获得,但使用 WSH 类来执行某些任务(例如创建快捷方式)则更简单易行。
使用 WScript.Shell 创建桌面快捷方式<o:p></o:p>
使用 COM 对象可快速执行的一个任务是创建快捷方式。假设您要在链接到 Windows PowerShell 主文件夹的桌面上创建快捷方式。首先,需要创建对 WScript.Shell 的引用,后者将存储在名为 $WshShell 的变量中:
$WshShell = New-Object -ComObject WScript.Shell<o:p></o:p>
|
<o:p> </o:p>
Get-Member 可处理 COM 对象,因此可键入以下命令来浏览对象成员:
PS> $WshShell | Get-Member<o:p></o:p>
<o:p> </o:p>
<o:p> </o:p>
TypeName:System.__ComObject#{41904400-be18-11d3-a28b-00104bd35090}<o:p></o:p>
<o:p> </o:p>
Name MemberType Definition<o:p></o:p>
---- ---------- ----------<o:p></o:p>
AppActivate Method bool AppActivate (Variant, <st1:place w:st="on"><st1:state w:st="on">Va.</st1:state></st1:place>..<o:p></o:p>
CreateShortcut Method IDispatch CreateShortcut (str...<o:p></o:p>
...<o:p></o:p>
|
<o:p> </o:p>
<!----><!----><!---->请注意: <o:p></o:p>
Get-Member 具有可选参数 InputObject,因此您可以使用该参数而无需通过管道向 Get-Member 提供输入。如果改用 Get-Member -InputObject $WshShell 命令,则将得到与上述相同的输出。如果使用 InputObject,则它会将其参数视为单独项。这表示,如果一个变量中具有几个对象,则 Get-Member 将这些对象视为对象数组。例如:<o:p></o:p>
PS> $a = 1,2,"three"<o:p></o:p>
PS> Get-Member -InputObject $a<o:p></o:p>
<o:p> </o:p>
TypeName:System.Object[]<o:p></o:p>
<o:p> </o:p>
Name MemberType Definition<o:p></o:p>
---- ---------- ----------<o:p></o:p>
Count AliasProperty Count = Length<o:p></o:p>
<o:p> </o:p>
...<o:p></o:p>
WScript.Shell CreateShortcut 方法可接受单个参数,该参数是指向要创建的快捷方式文件的路径。我们可以键入指向桌面的完整路径,但还有另一种更简单的方法。桌面通常是由当前用户的主文件夹中名为“桌面”的文件夹表示。Windows PowerShell 具有包含指向此文件夹的路径的变量 $Home。可以使用此变量来指定指向主文件夹的路径,然后,键入以下命令来添加“桌面”文件夹的名称以及要创建的快捷方式的名称:
$lnk = $WshShell.CreateShortcut("$Home\Desktop\PSHome.lnk")<o:p></o:p>
|
<o:p> </o:p>
<!----><!----><!---->请注意: <o:p></o:p>
在双引号中使用类似于变量名称的数据时,Windows PowerShell 将尝试替换匹配的值。如果使用单引号,则 Windows PowerShell 将不进行变量值替换。例如,尝试键入以下命令:<o:p></o:p>
PS> "$Home\Desktop\PSHome.lnk"<o:p></o:p>
C:\Documents and Settings\aka\Desktop\PSHome.lnk<o:p></o:p>
PS> '$Home\Desktop\PSHome.lnk'<o:p></o:p>
$Home\Desktop\PSHome.lnk<o:p></o:p>
<o:p> </o:p>
现在,我们有了一个名为 $lnk 的变量,变量中包含新的快捷方式引用。若要查看其成员,则可通过管道将其传递给 Get-Member。以下输出显示了需要用于完成快捷方式创建的成员:
PS> $lnk | Get-Member
<o:p>
</o:p>TypeName:System.__ComObject#{f935dc23-1cf0-11d0-adb9-00c04fd58a0b}
<o:p> </o:p>Name MemberType Definition
---- ---------- ----------
...
Save Method void Save ()
...
TargetPath Property string TargetPath () {get} {set}
...
需要指定 TargetPath(Windows PowerShell 的应用程序文件夹),然后通过调用 Save 方法保存该快捷方式 $lnk。Windows PowerShell 应用程序文件夹路径存储在变量 $PSHome 中,因此可键入以下命令来实现此操作:
$lnk.TargetPath = $PSHome
$lnk.Save()
使用 Windows PowerShell 中的 Internet Explorer <o:p></o:p>
使用 COM 可以自动启动许多应用程序,其中包括 Microsoft Office 系列应用程序和 Internet Explorer。Internet Explorer 演示了在处理基于 COM 的应用程序时涉及的一些典型技巧和问题。
通过指定 Internet Explorer ProgId (InternetExplorer.Application) 可以创建 Internet Explorer 实例:
$ie = New-Object -ComObject InternetExplorer.Application<o:p></o:p>
|
<o:p> </o:p>
此命令可启动 Internet Explorer,但该应用程序将不可见。如果键入 Get-Process,则可看到名为 iexplore 的进程正在运行。事实上,即使退出 Windows PowerShell,该进程仍将继续运行。必须重新启动计算机或使用类似于任务管理器之类的工具才可结束 iexplore 进程。
<!----><!----><!---->请注意: <o:p></o:p>
作为单独进程启动的 COM 对象通常称为 ActiveX 可执行文件,在它们启动时可能会显示用户界面窗口,但也可能不显示。如果创建了窗口,但该窗口不可见,例如 Internet Explorer,则焦点通常会移至 Windows 桌面,而您必须使该窗口可见才可与其进行交互。 <o:p></o:p>
如果键入 $ie | Get-Member,则可查看 Internet Explorer 的属性和方法。若要查看 Internet Explorer 窗口,请通过键入以下命令将 Visible 属性设置为 $true:
$ie.Visible = $true<o:p></o:p>
|
<o:p> </o:p>
随后,可以使用导航方法导航至特定的 web 地址:
$ie.Navigate("http://www.microsoft.com/technet/scriptcenter/default.mspx")<o:p></o:p>
|
<o:p> </o:p>
使用 Internet Explorer 对象模型的其他成员,可以从网页中检索文本内容。以下命令将显示当前网页正文中的 HTML 文本:
$ie.Document.Body.InnerText<o:p></o:p>
|
<o:p> </o:p>
若要在 PowerShell 中关闭 Internet Explorer,请调用其 Quit() 方法:
<o:p> </o:p>
这将强制关闭 Internet Explorer。$ie 变量将不再包含有效引用,即使该引用仍为 COM 对象也是如此。若要尝试使用该引用,则将收到自动化错误:
PS> $ie | Get-Member<o:p></o:p>
Get-Member :检索属性“Application”的字符串表示形式时发生异常:<o:p></o:p>
"被调用的对象已与其客户端断开连接。(HRESULT 出现异常: 0x80010108 (RPC_E_DISCONNECTED))" <o:p></o:p>
所在行:1 字符:16 <o:p></o:p>
+ $ie | Get-Member <<<<<o:p></o:p>
|
<o:p> </o:p>
您可以使用诸如 $ie = $null
分享到:
相关推荐
通过学习PowerShell基础教程,用户能够掌握如何利用其强大的对象模型和Cmdlet来自动化日常管理任务,提高工作效率。无论你是系统管理员还是开发者,PowerShell都是提升Windows环境管理能力不可或缺的工具。
Windows PowerShell是微软公司推出的一种强大的命令行和脚本语言,它自2006年首次推出以来,已经逐渐取代了老旧的Windows命令提示符(cmd.exe)和批处理文件(.bat或.cmd文件)成为系统管理员和开发者的首选工具。...
【PowerShell基础教程】 PowerShell是一种强大的脚本语言和命令行shell,主要应用于Windows操作系统,如XP、Server 2003、Vista和Server 2008。不同于传统的外壳程序(如Cmd.exe、SH、KSH、CSH和BASH),PowerShell...
因为PowerShell是可以和.Net 程序无缝集成的。所以.Net能用的东西在PowerShell里也几乎都能使用。那么如果想让PowerShell的交互性更强,更友好无疑是创建一个友好GUI界面了。本文介绍如何在PowerShell中创建窗体程序...
【PowerShell基础教程】 PowerShell是一种专为管理和自动化Windows操作系统设计的强大脚本语言,自Windows XP/Server 2003起,它逐渐成为Vista、Server 2008及后续版本的标准组件。PowerShell旨在提升系统管理员的...
传统外壳程序如Cmd.exe、SH、KSH、CSH和BASH通常以文本格式处理命令输出,而PowerShell则处理基于.NET平台的对象,这使得数据处理更为灵活和强大。 PowerShell的核心概念之一是Cmdlet(发音为“command-let”),...
1. **脚本编写**: PowerShell支持使用PowerShell语言编写脚本,语法类似C#,具备类型系统和异常处理机制,可以创建复杂的自动化任务。 2. **模块和脚本包**: PowerShell模块是可重用的代码单元,包含Cmdlets、提供...
特别是,与.Net、COM和WMI三大豪门的联姻,使得PowerShell必将在Windows世界里大放光彩。 与新锐.Net联姻 在Windows的世界里,.Net代表着现在和将来,是新生力量。与.Net联姻,就意味着榜上了粗腿,迈上了快车道。...
在IT行业中,C#是一种广泛使用的编程语言,尤其在Windows平台上的...通过理解如何创建和使用`Runspace`、`Pipeline`和`Command`对象,开发者可以在C#应用程序中无缝地集成PowerShell命令和脚本,提升应用的功能和效率。
"powershell 技术文档"可能介绍了如何创建和导入自定义模块,以及内置的许多核心模块,如PSDesiredStateConfiguration, ActiveDirectory等。 6. **PowerShell的英文资源** "windows powershell 实战(英文)”可能是...
它使您能够轻松创建和自定义部署方案,而不必诉诸难以自动化的复杂工具。展开展开是针对基于.net的Web应用程序的完整部署解决方案。 它使您能够轻松创建和自定义部署方案,而不必求助于难以自动化或难以设置的复杂...
精心挑选和整理的关于Windows PowerShell的教程 |powershell 技术文档 --|Powershell_技术教程.doc --|PowerShell基础教程 --|WindowsPowerShelluserGuide |powershell 中文教程 --|Windows PowerShell 入门指南...
Windows PowerShell V1.0 是微软推出的一个强大的命令行脚本环境,它专为管理和自动化Windows操作系统及基于.NET Framework 2.0的应用程序设计。这个版本的PowerShell是针对.NET Framework 2.0 RTM(发布候选版本)...
PowerShell 基于.NET框架,因此它能够充分利用.NET的对象模型,提供更高级的功能和更强的控制力。 PowerShell 的核心特点之一是它的面向对象性质。这意味着命令的输出是完整的对象,而不仅仅是文本,这使得数据处理...
《精通Windows Server 2008命令行与PowerShell》的内容简介回到顶部↑ 本书全面地介绍了windows server 2008命令行、powershell和脚本的使用,包括文件和文件夹的管理、磁盘管理、系统管理、活动目录管理、网络管理...
用户可以轻松地定义自己的函数和脚本,甚至可以通过 PowerShell 创建完整的应用程序。例如,可以通过以下代码来获取远程计算机的服务包版本号: ```powershell [string]$c = Read-Host "Enter computer name" $c = ...
《精通Windows Server 2008命令行与PowerShell》的内容简介回到顶部↑ 本书全面地介绍了windows server 2008命令行、powershell和脚本的使用,包括文件和文件夹的管理、磁盘管理、系统管理、活动目录管理、网络管理...
这一转变意味着PowerShell不仅能够执行传统的命令行程序,还能够处理复杂的.NET对象,并且能够在统一的接口和命令解释器中运行。 在PowerShell中,命令被称为Cmdlet(读作“command-let”),这是一种单一功能的...