在过去的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可以用到什么吗?
发布于 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
}
发布于 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)
}
发布于 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“对象引用及其所有方法和属性。
https://stackoverflow.com/questions/30957667
复制相似问题