某些软件组件具有 .NET Framework 和 COM 接口,因此可执行许多系统管理任务。Windows PowerShell 允许您使用这些组件,因此,您可以使用 cmdlet 执行这些任务,而不会受到任何限制。在最初版本的 Windows PowerShell 中,多数 cmdlet 不适用于远程计算机。我们将演示如何在直接使用 Windows PowerShell 中的 .NET Framework System.Diagnostics.EventLog 类来管理事件日志时消除此限制。
使用 New-Object 访问事件日志
.NET Framework 类库包含可用于管理事件日志的名为 System.Diagnostics.EventLog 的类。可以使用具有 TypeName 参数的 New-Object cmdlet 来创建 .NET Framework 类的新实例。例如,以下命令可创建事件日志引用:
PS> New-Object -TypeName System.Diagnostics.EventLog Max(K) Retain OverflowAction Entries Name ------ ------ -------------- ------- ----
尽管该命令已创建 EventLog 类实例,但该实例并不包含任何数据。这是由于未指定特定的事件日志。如何可获取实际事件日志?
将构造函数与 New-Object 结合使用
若要引用特定的事件日志,则需要指定该日志的名称。New-Object 具有 ArgumentList 参数。对象的特殊启动方法可使用作为值传递到此参数的参数。由于该方法用于构造对象,因此称为构造函数。例如,若要获取对 Application 日志的引用,请将字符串‘Application’指定为参数:
PS> New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application Max(K) Retain OverflowAction Entries Name ------ ------ -------------- ------- ---- 16,384 7 OverwriteOlder 2,160 Application
注意: | |
由于大多数 .NET Framework 核心类包含在 System 命名空间中,因此如果 Windows PowerShell 找不到指定的类型名称的匹配项,则将自动尝试查找在 System 命名空间中指定的类。这意味着,您可以指定 Diagnostics.EventLog 而不是 System.Diagnostics.EventLog。 |
在变量中存储对象
您可能希望存储对对象的引用,以便在当前 shell 中使用它。尽管通过 Windows PowerShell 可对管道执行许多操作,但是,为了减少需要使用的变量数,有时将对象的引用存储在变量中可更方便地对这些对象进行操作。
Windows PowerShell 允许您创建其本质为对象的变量。任何有效的 Windows PowerShell 命令的输出均可存储在变量中。变量名称始终以 $ 开头。若要在名为 $AppLog 的变量中存储对应用程序日志的引用,请键入变量名称、后跟等号,然后键入用于创建应用程序日志对象的命令:
PS> $AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
随后,如果键入 $AppLog,则可看到 $AppLog 变量中包含该应用程序日志:
PS> $AppLog Max(K) Retain OverflowAction Entries Name ------ ------ -------------- ------- ---- 16,384 7 OverwriteOlder 2,160 Application
使用 New-Object 访问远程事件日志
前一节中使用的命令主要适用于本地计算机,但 Get-EventLog cmdlet 也可实现相同的功能。若要访问远程计算机上的应用程序日志,则必须将日志名称以及计算机名称(或 IP 地址)作为参数进行提供。
PS> $RemoteAppLog = New-Object -TypeName System.Diagnostics.EventLog Application,192.168.1.81 PS> $RemoteAppLog Max(K) Retain OverflowAction Entries Name ------ ------ -------------- ------- ---- 512 7 OverwriteOlder 262 Application
既然我们已将事件日志的引用存储在 $RemoteAppLog 变量中,那么还可对其执行哪些任务?
使用对象方法清除事件日志
对象中经常具有可调用以执行任务的方法。可以使用 Get-Member 来显示与对象关联的方法。以下命令和选定的输出显示了 EventLog 类的其中一些方法:
PS> $RemoteAppLog | Get-Member -MemberType Method TypeName: System.Diagnostics.EventLog Name MemberType Definition ---- ---------- ---------- ... Clear Method System.Void Clear() Close Method System.Void Close() ... GetType Method System.Type GetType() ... ModifyOverflowPolicy Method System.Void ModifyOverflowPolicy(Overfl... RegisterDisplayName Method System.Void RegisterDisplayName(String ... ... ToString Method System.String ToString() WriteEntry Method System.Void WriteEntry(String message),... WriteEvent Method System.Void WriteEvent(EventInstance in...
使用 Clear() 方法可清除事件日志。在调用方法时,方法名称必须后跟圆括号,即使该方法不需要参数也是这样。这样,Windows PowerShell 可以将方法与可能同名的属性区分开来。键入以下命令可调用 Clear 方法:
PS> $RemoteAppLog.Clear()
键入以下命令可显示日志。此时,您将看到事件日志已清除,并且该日志中有 0 个而不是 262 个条目:
PS> $RemoteAppLog Max(K) Retain OverflowAction Entries Name ------ ------ -------------- ------- ---- 512 7 OverwriteOlder 0 Application
使用 New-Object 创建 COM 对象
可以使用 New-Object 处理组件对象模型 (COM) 组件。组件的范围非常广泛,从 Windows Script Host (WSH) 中包含的各种库到 ActiveX 应用程序,例如大多数系统中所安装的 Internet Explorer。
New-Object 使用 .NET Framework 运行时可调用包装来创建 COM 对象,因此它具有的限制与在调用 COM 对象时 .NET Framework 具有的限制相同。若要创建 COM 对象,则需要利用要使用的 COM 类的编程标识符或 ProgId 来指定 ComObject 参数。在本用户指南中,将不对 COM 使用限制和确定系统中有哪些 ProgId 可用进行详尽的讨论,但环境中的大多数已知对象(例如 WSH)可以在 Windows PowerShell 中使用。
可以通过指定这些 ProgId 来创建 WSH 对象:WScript.Shell、WScript.Network、Scripting.Dictionary 和 Scripting.FileSystemObject。以下命令可以创建这些对象:
New-Object -ComObject WScript.Shell New-Object -ComObject WScript.Network New-Object -ComObject Scripting.Dictionary New-Object -ComObject Scripting.FileSystemObject
尽管这些类的大多数功能可在 Windows PowerShell 中以其他方式获得,但使用 WSH 类来执行某些任务(例如创建快捷方式)则更简单易行。
使用 WScript.Shell 创建桌面快捷方式
使用 COM 对象可快速执行的一个任务是创建快捷方式。假设您要在链接到 Windows PowerShell 主文件夹的桌面上创建快捷方式。首先需要创建对 WScript.Shell 的引用,后者将存储在名为 $WshShell 的变量中:
$WshShell = New-Object -ComObject WScript.Shell
Get-Member 适用于 COM 对象,因此可键入以下命令来浏览对象成员:
PS> $WshShell | Get-Member TypeName: System.__ComObject#{41904400-be18-11d3-a28b-00104bd35090} Name MemberType Definition ---- ---------- ---------- AppActivate Method bool AppActivate (Variant, Va... CreateShortcut Method IDispatch CreateShortcut (str... ...
Get-Member 具有可选的 InputObject 参数,您可以使用该参数而无需使用管道向 Get-Member 提供输入。如果改用 Get-Member -InputObject $WshShell 命令,则将得到上面所示的输出。如果使用 InputObject,则它会将其参数视为单个项。这意味着,如果一个变量中有若干个对象,Get-Member 就会将这些对象视为对象数组。例如:
PS> $a = 1,2,"three" PS> Get-Member -InputObject $a TypeName: System.Object[] Name MemberType Definition ---- ---------- ---------- Count AliasProperty Count = Length ...
WScript.Shell CreateShortcut 方法可接受单个参数,该参数是指向要创建的快捷方式文件的路径。我们可以键入指向桌面的完整路径,但还有另一种更简单的方法。桌面通常是由当前用户的主文件夹中名为“桌面”的文件夹表示。Windows PowerShell 具有包含指向此文件夹的路径的变量 $Home。可以使用此变量来指定指向主文件夹的路径,然后,键入以下命令来添加“桌面”文件夹的名称以及要创建的快捷方式的名称:
$lnk = $WshShell.CreateShortcut("$Home\Desktop\PSHome.lnk")
在双引号中使用类似于变量名称的数据时,Windows PowerShell 将尝试替换匹配的值。如果使用单引号,则 Windows PowerShell 将不进行变量值替换。例如,尝试键入以下命令:
PS> "$Home\Desktop\PSHome.lnk" C:\Documents and Settings\aka\Desktop\PSHome.lnk PS> '$Home\Desktop\PSHome.lnk' $Home\Desktop\PSHome.lnk
现在,我们有一个名为 $lnk 的变量,该变量中包含新的快捷方式引用。若要查看其成员,则可通过管道将其传递给 Get-Member。以下输出显示了需要用于完成快捷方式创建的成员:
PS> $lnk | Get-Member
TypeName: System.__ComObject#{f935dc23-1cf0-11d0-adb9-00c04fd58a0b}
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
使用 COM 可以自动启动许多应用程序,其中包括 Microsoft Office 系列应用程序和 Internet Explorer。Internet Explorer 演示了在处理基于 COM 的应用程序时涉及的一些典型技巧和问题。
通过指定 Internet Explorer ProgId (InternetExplorer.Application) 可以创建 Internet Explorer 实例:
$ie = New-Object -ComObject InternetExplorer.Application
此命令可启动 Internet Explorer,但该应用程序将不可见。如果键入 Get-Process,则可看到名为 iexplore 的进程正在运行。事实上,即使退出 Windows PowerShell,该进程仍将继续运行。必须重新启动计算机或使用类似于任务管理器之类的工具才可结束 iexplore 进程。
注意: | |
作为单独进程启动的 COM 对象通常称为 ActiveX 可执行文件,在它们启动时可能会显示用户界面窗口,但也可能不显示。如果创建了窗口,但该窗口不可见,例如 Internet Explorer,则焦点通常会移至 Windows 桌面,而您必须使该窗口可见才可与其进行交互。 |
如果键入 $ie | Get-Member,则可查看 Internet Explorer 的属性和方法。若要查看 Internet Explorer 窗口,请通过键入以下命令将 Visible 属性设置为 $true:
$ie.Visible = $true
随后,可以使用 Navigate 方法导航至特定的 Web 地址:
$ie.Navigate("http://www.microsoft.com/technet/scriptcenter/default.mspx")
使用 Internet Explorer 对象模型的其他成员,可以从网页中检索文本内容。以下命令将显示当前网页正文中的 HTML 文本:
$ie.Document.Body.InnerText
若要在 PowerShell 中关闭 Internet Explorer,请调用其 Quit() 方法:
$ie.Quit()
这将强制关闭 Internet Explorer。$ie 变量将不再包含有效引用,即使该引用仍为 COM 对象也是如此。若要尝试使用该引用,则将收到自动化错误:
PS> $ie | Get-Member Get-Member : Exception retrieving the string representation for property "Appli cation" : "The object invoked has disconnected from its clients. (Exception fro m HRESULT: 0x80010108 (RPC_E_DISCONNECTED))" At line:1 char:16 + $ie | Get-Member <<<<
您可以使用诸如 $ie = $null 之类的命令来删除剩余的引用,也可通过键入以下命令完全删除该变量:
Remove-Variable ie
注意: | |
在删除对某一项的引用时,对于如何确定是退出还是继续运行 ActiveX 可执行文件没有通用标准。退出或继续运行应用程序取决于以下几种情况:该应用程序是否可见、已编辑的文档是否在其中运行,以及 Windows PowerShell 是否仍在运行。鉴于此原因,您应该对要在 Windows PowerShell 中使用的每个 ActiveX 可执行文件测试其终止行为。 |
获取有关 .NET Framework 包装的 COM 对象的警告
在某些情况下,COM 对象可能具有关联的 .NET Framework 运行时可调用包装(即 RCW),而这将由 New-Object 使用。由于 RCW 的行为可能与标准 COM 对象的行为有所不同,因此 New-Object 的 Strict 参数将发出有关 RCW 访问的警告。如果指定 Strict 参数,然后创建使用 RCW 的 COM 对象,则将收到一条警告消息:
PS> $xl = New-Object -ComObject Excel.Application -Strict New-Object : The object written to the pipeline is an instance of the type "Mic rosoft.Office.Interop.Excel.ApplicationClass" from the component's primary inte rop assembly. If this type exposes different members than the IDispatch members , scripts written to work with this object might not work if the primary intero p assembly is not installed. At line:1 char:17 + $xl = New-Object <<<< -ComObject Excel.Application -Strict
尽管已创建对象,但仍将警告您它不是标准的 COM 对象。