`

PowerShell基础教程(13)——创建 .NET 和 COM 对象

阅读更多

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>

在变量中存储对象<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 变量中那么还可对其执行哪些任务

使用对象方法清除事件日志<o:p></o:p>

对象中经常具有可调用以执行任务的方法。可以使用 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.ShellWScript.NetworkScripting.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}

...

需要指定 TargetPathWindows PowerShell 的应用程序文件夹),然后通过调用 Save 方法保存该快捷方式 $lnkWindows PowerShell 应用程序文件夹路径存储在变量 $PSHome 中,因此可键入以下命令来实现此操作:

$lnk.TargetPath = $PSHome

$lnk.Save()

使用 Windows PowerShell 中的 Internet Explorer <o:p></o:p>

使用 COM 可以自动启动许多应用程序其中包括 Microsoft Office 系列应用程序和 Internet ExplorerInternet 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() 方法

$ie.Quit()<o:p></o:p>

<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基础教程.doc

    通过学习PowerShell基础教程,用户能够掌握如何利用其强大的对象模型和Cmdlet来自动化日常管理任务,提高工作效率。无论你是系统管理员还是开发者,PowerShell都是提升Windows环境管理能力不可或缺的工具。

    Windows Powershell

    Windows PowerShell是微软公司推出的一种强大的命令行和脚本语言,它自2006年首次推出以来,已经逐渐取代了老旧的Windows命令提示符(cmd.exe)和批处理文件(.bat或.cmd文件)成为系统管理员和开发者的首选工具。...

    PowerShell 基础教程

    【PowerShell基础教程】 PowerShell是一种强大的脚本语言和命令行shell,主要应用于Windows操作系统,如XP、Server 2003、Vista和Server 2008。不同于传统的外壳程序(如Cmd.exe、SH、KSH、CSH和BASH),PowerShell...

    在PowerShell中创建Winform窗体,给PowerShell脚本添加GUI界面 - 示例

    因为PowerShell是可以和.Net 程序无缝集成的。所以.Net能用的东西在PowerShell里也几乎都能使用。那么如果想让PowerShell的交互性更强,更友好无疑是创建一个友好GUI界面了。本文介绍如何在PowerShell中创建窗体程序...

    PowerShell基础教程

    【PowerShell基础教程】 PowerShell是一种专为管理和自动化Windows操作系统设计的强大脚本语言,自Windows XP/Server 2003起,它逐渐成为Vista、Server 2008及后续版本的标准组件。PowerShell旨在提升系统管理员的...

    经典PowerShell入门教程.docx

    传统外壳程序如Cmd.exe、SH、KSH、CSH和BASH通常以文本格式处理命令输出,而PowerShell则处理基于.NET平台的对象,这使得数据处理更为灵活和强大。 PowerShell的核心概念之一是Cmdlet(发音为“command-let”),...

    PowerShell教程

    1. **脚本编写**: PowerShell支持使用PowerShell语言编写脚本,语法类似C#,具备类型系统和异常处理机制,可以创建复杂的自动化任务。 2. **模块和脚本包**: PowerShell模块是可重用的代码单元,包含Cmdlets、提供...

    PowerShell入门教程之访问.Net程序集、COM和WMI实例

    特别是,与.Net、COM和WMI三大豪门的联姻,使得PowerShell必将在Windows世界里大放光彩。 与新锐.Net联姻  在Windows的世界里,.Net代表着现在和将来,是新生力量。与.Net联姻,就意味着榜上了粗腿,迈上了快车道。...

    C#调用PowerShell

    在IT行业中,C#是一种广泛使用的编程语言,尤其在Windows平台上的...通过理解如何创建和使用`Runspace`、`Pipeline`和`Command`对象,开发者可以在C#应用程序中无缝地集成PowerShell命令和脚本,提升应用的功能和效率。

    powershell中英文教程

    "powershell 技术文档"可能介绍了如何创建和导入自定义模块,以及内置的许多核心模块,如PSDesiredStateConfiguration, ActiveDirectory等。 6. **PowerShell的英文资源** "windows powershell 实战(英文)”可能是...

    .net Web应用程序的基于Powershell的部署解决方案-.NET开发

    它使您能够轻松创建和自定义部署方案,而不必诉诸难以自动化的复杂工具。展开展开是针对基于.net的Web应用程序的完整部署解决方案。 它使您能够轻松创建和自定义部署方案,而不必求助于难以自动化或难以设置的复杂...

    Windows PowerShell教程合集

    精心挑选和整理的关于Windows PowerShell的教程 |powershell 技术文档 --|Powershell_技术教程.doc --|PowerShell基础教程 --|WindowsPowerShelluserGuide |powershell 中文教程 --|Windows PowerShell 入门指南...

    Windows PowerShell V1.0(用于 .NET Framework 2.0 RTM)发行说明.docx

    Windows PowerShell V1.0 是微软推出的一个强大的命令行脚本环境,它专为管理和自动化Windows操作系统及基于.NET Framework 2.0的应用程序设计。这个版本的PowerShell是针对.NET Framework 2.0 RTM(发布候选版本)...

    Powershell 实例教程

    PowerShell 基于.NET框架,因此它能够充分利用.NET的对象模型,提供更高级的功能和更强的控制力。 PowerShell 的核心特点之一是它的面向对象性质。这意味着命令的输出是完整的对象,而不仅仅是文本,这使得数据处理...

    精通windows server 2008 命令行与powershell电子书PDF版(第一卷)

    《精通Windows Server 2008命令行与PowerShell》的内容简介回到顶部↑ 本书全面地介绍了windows server 2008命令行、powershell和脚本的使用,包括文件和文件夹的管理、磁盘管理、系统管理、活动目录管理、网络管理...

    powershell教程

    用户可以轻松地定义自己的函数和脚本,甚至可以通过 PowerShell 创建完整的应用程序。例如,可以通过以下代码来获取远程计算机的服务包版本号: ```powershell [string]$c = Read-Host "Enter computer name" $c = ...

    精通windows server 2008 命令行与powershell电子书PDF版(第二卷)

    《精通Windows Server 2008命令行与PowerShell》的内容简介回到顶部↑ 本书全面地介绍了windows server 2008命令行、powershell和脚本的使用,包括文件和文件夹的管理、磁盘管理、系统管理、活动目录管理、网络管理...

    powershell

    这一转变意味着PowerShell不仅能够执行传统的命令行程序,还能够处理复杂的.NET对象,并且能够在统一的接口和命令解释器中运行。 在PowerShell中,命令被称为Cmdlet(读作“command-let”),这是一种单一功能的...

Global site tag (gtag.js) - Google Analytics