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显示所有组件