彩票走势图

PowerShell2.0之与COM对象交互

转帖|其它|编辑:郝浩|2011-05-18 14:46:55.000|阅读 649 次

概述:网络中存在大量由VBScript和Jscript或者其他Windows脚本宿主相关的语言编写的代码,其中相当一部分用对应语言实现很简短,而且有部分代码甚至不能转换为PowerShell代码。丢弃所有这些代码并且完全使用PowerShell重写很不明智,因此需要在PowerShell中有一种重用Jscript和VBScript脚本的代码方法。

# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>

  网络中存在大量由VBScript和Jscript或者其他Windows脚本宿主相关的语言编写的代码,其中相当一部分用对应语言实现很简短,而且有部分代码甚至不能转换为PowerShell代码。丢弃所有这些代码并且完全使用PowerShell重写很不明智,因此需要在PowerShell中有一种重用Jscript和VBScript脚本的代码方法。

  MSScriptControl这个COM对象可以作为脚本环境的宿主,其ProgID是MSScriptControl.ScriptControl。用户可以用其注册并执行代码,使用这个对象作为从PowerShell中调用现有VBScript和Jscript脚本的方法。一旦导入脚本,即可调用其中的函数,传递参数并返回值。

  为了示范脚本如何控制对象的操作,下面演示计算文件大小的两个实例,分别是Jscript编写的FileSize.js和VBScirpt编写的FileSize.vbs。两个脚本中包括定义为“GetFileSize()”的函数接受一个文件路径为参数,并返回文件路径及其大小。Jscript脚本的源代码如下:

  function GetFileSize(filePath)

  {

  var fileSystem = new ActiveXObject("Scripting.FileSystemObject");

  var file = fileSystem.GetFile(filePath);

  return (filePath + " has " + file.Size + " bytes.");

  }

  VBScript脚本的代码如下:

  Function GetFileSize(filePath)

  Dim fileSystem

  Set fileSystem = CreateObject("Scripting.FileSystemObject")

  Dim file

  Set file = fileSystem.GetFile(filePath)

  GetFileSize = filePath & " has " & file.Size & " bytes."

  End Function

  能够看到每种语言都有其相对特殊的函数声明方法、变量,以及与COM对象操作的方法。为了能够从PowerShell中调用Jscript函数,需要读取FileSize.js文件内容并且传递给脚本空间的AddCode()方法。这个方法将会执行函数定义,并使其在后面可用。

1 执行代码

  在将脚本代码包含在脚本控件中后,即可调用在Jscript中定义的函数,为此可以使用Eval()或者Run()方法。Eval()方法将字符串作为输入并执行,其返回值将会把结果返回给调用方,本实例为PowerShell;Run()方法可以接受多个参数,其中第1个是函数名,后续是将要传递给函数的参数,该方法返回函数的返回值给PowerShell的脚本。在这里创建一个名为“JScriptEval.ps1”的脚本,分别使用Eval()和Run()调用Jscript函数,代码如下:

  $jscript = New-Object -COM MSScriptControl.ScriptControl

  $jscript.Language = "JScript"

  $jsLines = Get-Content "FileSize.js"

  $jsCode = [string]::Join("`n", $jsLines)

  $jscript.AddCode($jsCode)

  $fileName = (dir FileSize.js).FullName

  Write-Host "Using Eval"

  $jscript.Eval("GetFileSize(`"$($fileName.Replace('\', '\\'))`")")

  Write-Host "Using Run"

  $jscript.Run("GetFileSize", $fileName)

  其中将Language属性设置为“JScript”,表示其后调用的所有代码都是Jscript。接下来用Get-Content cmdlet获取FileSize.js文件中包含的所有内容,然后为各行代码添加换行符,并将其拼接后传递给AddCode()方法。

  Eval()方法需要将双引号转义为Jscript字符串,把反斜杠替换为双反斜杠。因为反斜杠在Jscript中是一个有特殊含义的转义字符,需要被转义;Run()方法不需要执行任何转义操作,因为使用的是脚本控件的机制传递参数。图1所示为该脚本的执行结果。

  

  图1 执行结果

  Eval()和Run()方法的执行结果相同,使用Run()方法可避免很多不必要的麻烦。

  下面创建一个名为“VBScriptEval.ps1”的脚本,通过调用VBScript代码定义的GetFileSize()函数,代码如下:

  $vbscript = New-Object -COM MSScriptControl.ScriptControl

  $vbscript.Language = "VBScript"

  $vbsLines = Get-Content "FileSize.vbs"

  $vbsCode = [string]::Join("`n", $vbsLines)

  $vbscript.AddCode($vbsCode)

  $fileName = (dir FileSize.vbs).FullName

  Write-Host "Using Eval"

  $vbscript.Eval("GetFileSize(`"$fileName`")")

  Write-Host "Using Run"

  $vbscript.Run("GetFileSize", $fileName)

  这个脚本与前面Jscript版本的最大不同是创建脚本控件对象的Language属性值。需要强调的一点是在VBScript脚本中调用Eval()方法时,不需要转义反斜杠字符,因其在VBScript中并不包含特殊含义。该脚本的执行结果如图2所示。

  

  图2 执行结果

2 在MSScriptControl中公开对象

  Eval()和Run()方法为其他语言提供了很好的访问途径,但其表现不像真正的方法。如果能调用脚本控件对象的特性,即动态对象生成,即可很好地解决这个问题。MSScriptControl对象有一个CodeObject属性,用于将附加到脚本控件的代码返回一个匿名对象,代码对象将会公开作为公开方法添加的所有函数,这样即可使得外部脚本对象的操作与常规的.NET对象毫无差别。

  下面使用该属性调用JScript函数,创建一个新的脚本文件“JScriptCodeObject.ps1”。配置一个脚本对象,通过动态生成的对象调用其函数,代码如下:

  $jscript = New-Object -COM MSScriptControl.ScriptControl

  $jscript.Language = "JScript"

  $jsLines = Get-Content "FileSize.js"

  $jsCode = [string]::Join("`n", $jsLines)

  $jscript.AddCode($jsCode)

  $fileName = (dir FileSize.js).FullName

  $fileSize = $jscript.CodeObject

  $fileSize.GetFileSize($fileName)

  脚本的执行结果如图3所示。

  

  图3 执行结果

  接下对比VBScript版本,下面是脚本VBScriptCodeObject.ps1的代码:

  $vbscript = New-Object -COM MSScriptControl.ScriptControl

  $vbscript.Language = "VBScript"

  $vbsLines = Get-Content "FileSize.vbs"

  $vbsCode = [string]::Join(";`n", $vbsLines)

  $vbscript.AddCode($vbsCode)

  $fileName = (dir FileSize.vbs).FullName

  $fileSize = $vbscript.CodeObject

  $fileSize.GetFileSize($fileName)

  执行结果如图4所示。

   

  图4 执行结果

3 总 结

  PowerShell为COM对象提供了近乎完美的支持,本文的实例涉及主要的交互性操作,如使用集合和索引属性。只要不同的应用程序和服务已经具有公开的COM自动化接口,则可尝试使用COM来提高工作效率。本文介绍了针对Windows脚本宿主的自动化编程,用户可以通过以上的介绍扩展到对其他COM对象进行操作。

作者: 付海军
出处:


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn

文章转载自:付海军的专栏

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP