我一直在运行密码过期脚本的传递6个月没有任何问题。该脚本将读取一个静态html文件并更改内存中的一些内容,然后将发送一封html电子邮件给所有过期密码的用户。使用New-Object -ComObject解析本地HTML文件“HTMLFile”坏了?

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

我现在得到的错误:

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 BROKEN。

我只是能够使用相同的操作系统,但低于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中使用什么吗?

2015-06-20

kevin

+1

你可以尝试一个IE对象:'$ ie = New-Object -COM'InternetExplorer.Application'; $ ie.Navigate(“file:// $($ PWD.Path)/passwordreminder.html”'。我没有PowerShell v5,所以我无法测试。如果'HTMLFile'被破坏,这可能会 –

+1

在工作服务器和非工作服务器上都可以将违规行更改为'$ html.Write;',运行它并比较结果?这将输出哪些重载的Write方法可用在'$ html'对象上,也许有一个新的可用,PowerShell现在试图调用“错误”的。 –

+0

@Ansgar感谢,仍然可以在v5.0 !!!!我能够重写部分脚本使用这种方法,但是这种方法当然并不理想,脚本会编辑内存中的HTML文档,以便每个用户都有一个即将到来的密码,这意味着我必须为每个人启动一个新的IE进程。在某些日子里可以达到20-30 +进程,我可以通过运行一个“停止进程”来杀死其中的一些进程,但仍然会比较大到以前的工作解决方案。我会用这个,直到我能找到更好的解决方法。谢谢!!!! –