首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用新对象-ComObject "HTMLFile“破解解析本地HTML文件?

使用新对象-ComObject "HTMLFile“破解解析本地HTML文件?
EN

Stack Overflow用户
提问于 2015-06-21 02:48:55
回答 4查看 10.4K关注 0票数 6

在过去的6个月里,我一直在运行密码过期脚本,没有任何问题。该脚本将读取一个静态html文件,并围绕内存中的一些内容进行更改,然后将向所有密码过期的用户发送一封html电子邮件。

在过去的一周左右,这个脚本似乎被打破了。经过进一步的研究,我已经将错误范围缩小到Powershell应该创建一个新的ComObject并将该ComObject文件写入该HTML的部分。

我现在得到了错误:

No coercion operator is defined between types 'System.Array' and 'System.String'
At line:1 char:1
+ $html.write($source);
+ ~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (:) [], InvalidOperationException
    + FullyQualifiedErrorId : System.InvalidOperationException

当我运行下面的代码行时,会出现上述错误:

$html = New-Object -ComObject "HTMLFile"
$src = Get-Content -path "./passwordreminder.html" -Raw
$html.write($src)

当我调用write()方法时,我得到了错误。

由于它在过去的6个月里一直运行良好,所以我能想到的唯一改变的就是我的powershell版本。我相信当我开始运行这个脚本时,我使用的是Powershell v4.0,但在Windows更新之后,我猜Powershell现在是v5.0。如下所示:

Name                           Value
----                           -----
PSVersion                      5.0.10105.0
WSManStackVersion              3.0
SerializationVersion           1.1.0.1
CLRVersion                     4.0.30319.34209
BuildVersion                   10.0.10105.0
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
PSRemotingProtocolVersion      2.3

该脚本在Windows Server 2012 R2 OS上运行。

有谁有什么想法吗?

我在调用ComObject上的IHTMLDocument2_write()方法的其他问题中看到了一些建议,但当我尝试调用该方法时,它并不存在。

更新:

在我的Powershell版本中,我能够确认这确实是损坏的

我只能在不同的服务器上使用相同的操作系统测试相同的代码,但版本低于Powershell:

Name                           Value
----                           -----
PSVersion                      4.0
WSManStackVersion              3.0
SerializationVersion           1.1.0.1
CLRVersion                     4.0.30319.34014
BuildVersion                   6.3.9600.17090
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0}
PSRemotingProtocolVersion      2.2

并且代码可以按预期运行。

有人知道这个新版本的Powershell可以用到什么吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-06-21 05:17:24

您可以尝试使用Internet Explorer COM对象:

$ie = New-Object -COM 'InternetExplorer.Application'

$ie.Navigate("file://$($PWD.Path)/passwordreminder.html")
do {
  Start-Sleep -Milliseconds 100
} until ($ie.ReadyState -eq 4)

# do stuff

但是我没有PowerShell v5,所以我不能测试。如果HTMLFile坏了,这也可能是坏的。

如果需要重复运行,可以在外部循环中调用Navigate()方法(以及等待它完成页面加载的循环)。

$ie = New-Object -COM 'InternetExplorer.Application'

foreach (...) {
  $ie.Navigate("file://$($PWD.Path)/passwordreminder.html")
  do {
    Start-Sleep -Milliseconds 100
  } until ($ie.ReadyState -eq 4)

  # do stuff
}
票数 2
EN

Stack Overflow用户

发布于 2016-05-23 06:39:52

如果您提供的是UCS-2字节数组而不是字符串,这似乎可以正常工作:

$html = New-Object -ComObject "HTMLFile"
$src = Get-Content -path "./passwordreminder.html" -Raw
$src = [System.Text.Encoding]::Unicode.GetBytes($src)
try
{
    # This works in PowerShell 4
    $html.IHTMLDocument2_write($src)
}
catch
{
    # This works in PowerShell 5
    $html.write($src)
}
票数 5
EN

Stack Overflow用户

发布于 2018-08-04 05:01:33

此代码段的工作方式是通过.NET Add- type -AssemblyName cmdlet添加框架的-AssemblyName类型。

Add-Type -AssemblyName "Microsoft.mshtml"
$html = New-Object -ComObject "HTMLFile"
$svc = Get-Service | Select-Object Name, Status | ConvertTo-Html
$svc | Out-File -FilePath .\report.html -Force
$htmlFile = Get-Content -Path .\report.html -Raw
$html.IHTMLDocument2_write($htmlFile)

$html变量包含"HTMLFile“对象引用及其所有方法和属性。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30957667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档