PowerShell调用大漠插件(其它com组件)

  在Windows日常的运维当中,很少有需要直接操作前端GUI,大多数情况下都是直接后台操作。

  可是有些个别情况,总是需要模拟鼠标键盘点一点,按一按的情况。

  PowerShell做为微软Windows下最强的脚本语言,像自动化操作这种功能肯定也是需要能实现的才是,毕竟是亲儿子。

  网上baidu出来的很多技术知识实在是不敢恭维,好在有Google,帮忙解疑了不少。

  在国内,关于自动化操作,我的第一个想法就是直接调用第三组件,像大漠插件,这种前人已经造好轮子,我们能直接拿来使用真是一件幸事。

  在PowerShell调用第三方组件,可以使用New-Object这个cmdlet。查看这个命令的帮助文档可以发现,这个命令可以创建一个 .NET Framework或COM对象的实例

New-Object
   [-TypeName] <String>
   [[-ArgumentList] <Object[]>]
   [-Property <IDictionary>]
   [<CommonParameters>]
New-Object
   [-ComObject] <String>
   [-Strict]
   [-Property <IDictionary>]
   [<CommonParameters>]

  对于我们想要调用大漠插件使用这个命令就对了。

  首先,可以直接网上下载大漠插件3.1233(这个是免费版本),一般都会有附带大漠接口说明.chm,里面有关于这个插件的各种说明,其它的插件也差不多是这个原理

  然后,根据帮助文档说明,我们把大漠插件手动注册到系统里面,%path%根据系统的文件路径对应修改

regsvr32 /s %path%\dm.dll

  最后,在PowerShell里面直接进行调用

$dm = New-Object -ComObject dm.dmsoft
dm.ver()

  像这个就是输出大漠的版本号.

 

  但是,在实际操作当可能会出现这样的错误:

  上面明明已经通过regsvr32注册进去了,怎么还是出现没有注册类这样的错误提示呢?

  也是折腾了许久才想明白,我自己使用的操作系统是使用64位的操作系统,默认运行的PowerShell也是64位的,而大漠插件3.1233这个版本是32位!!!!。

  对于PowerShell,64位认不到32位的注册类。明白了这个原由之后,我们就可以很轻松的通过使用系统自带的32位PowerShell来调用大漠插件了。

32位的PowerShell可以在这边打开,在这边可能会出现安全提示,直接选Yes就可以

  再次通过调用就能正常显示对com组件的调用了

 

  最后,有朋友会发现不知道Windows里面都有哪些组件,分享一个网上的现成PowerShell脚本,可是显示Windows里面带的组件

function Get-ComObject {
<#
.Synopsis
Returns a list of ComObjects

.DESCRIPTION
This function has two parameter sets, it can either return all ComObject or a sub-section by the filter parameter. This information is gathered from the HKLM:\Software\Classes container.

.NOTES   
Name: Get-ComObject
Author: Jaap Brasser
Version: 1.0
DateUpdated: 2013-06-24

.LINK
http://www.jaapbrasser.com

.PARAMETER Filter
The string that will be used as a filter. Wildcard characters are allowed.
    
.PARAMETER ListAll
Switch parameter, if this parameter is used no filter is required and all ComObjects are returned

.EXAMPLE
Get-ComObject -Filter *Application

Description:
Returns all objects that match the filter

.EXAMPLE
Get-ComObject -Filter ????.Application

Description:
Returns all objects that match the filter

.EXAMPLE
Get-ComObject -ListAll

Description:
Returns all ComObjects
#>
    param(
        [Parameter(Mandatory=$true,
        ParameterSetName='FilterByName')]
            [string]$Filter,
        [Parameter(Mandatory=$true,
        ParameterSetName='ListAllComObjects')]
            [switch]$ListAll
    )
    $ListofObjects = Get-ChildItem HKLM:\Software\Classes -ErrorAction SilentlyContinue | 
    Where-Object {
        $_.PSChildName -match '^\w+\.\w+$' -and (Test-Path -Path "$($_.PSPath)\CLSID")
    } | Select-Object -ExpandProperty PSChildName 
    
    if ($Filter) {
        $ListofObjects | Where-Object {$_ -like $Filter}
    } else {
        $ListofObjects
    }
}

  这个Get-ComObject有两个参数,一个是-Filter过虑,一个是-ListAll显示所有组件

posted @ 2020-12-05 11:12  流云飞虹  阅读(526)  评论(0编辑  收藏  举报