我一直在運行密碼過期腳本的傳遞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中使用什麼嗎?
你可以嘗試一個IE對象:'$ ie = New-Object -COM'InternetExplorer.Application'; $ ie.Navigate(「file:// $($ PWD.Path)/passwordreminder.html」'。我沒有PowerShell v5,所以我無法測試。如果'HTMLFile'被破壞,這可能會 –
在工作服務器和非工作服務器上都可以將違規行更改爲'$ html.Write;',運行它並比較結果?這將輸出哪些重載的Write方法可用在'$ html'對象上,也許有一個新的可用,PowerShell現在試圖調用「錯誤」的。 – BACON
@Ansgar感謝,仍然可以在v5.0 !!!!我能夠重寫部分腳本使用這種方法,但是這種方法當然並不理想,腳本會編輯內存中的HTML文檔,以便每個用戶都有一個即將到來的密碼,這意味着我必須爲每個人啓動一個新的IE進程。在某些日子裏可以達到20-30 +進程,我可以通過運行一個「停止進程」來殺死其中的一些進程,但仍然會比較大到以前的工作解決方案。我會用這個,直到我能找到更好的解決方法。謝謝!!!! – kevin