[英]How do I find out the type of parameter in a PowerShell script when working via COM?
我正在編寫一個腳本以在操作系統“Windows 10”中的“Windows PowerShell”5.1 版和“PowerShell”7 版中工作。
我正在使用來自“Windows 窗體”的 class HtmlDocument
通過 COM 創建 object:
$dom = New-Object -ComObject "HTMLFile"
我想用這個class的方法write
。 文檔說它有一個System.String
類型參數。 但是將System.String
類型的字符串傳遞給方法write
不起作用:
$dom = New-Object -ComObject "HTMLFile"
[System.String] $str = "Text"
$dom.write($str) # Error: type mismatch
我檢查了方法write
需要什么類型的參數:
$dom = New-Object -ComObject "HTMLFile"
$dom | Get-Member write
我得到了這個結果:
TypeName: System.__ComObject#{3050f55f-98b5-11cf-bb82-00aa00bdce0b}
Name MemberType Definition
---- ---------- ----------
write Method void write (SAFEARRAY(Variant) psarray)
我讀到SAFEARRAY和Variant是 C++ 中使用 COM 時用於編組的結構。 使用這些結構,您可以傳輸任何類型的數組中的數據。 SAFEARRAY
是一個數組,除了數據之外,它還存儲有關自身的信息。 Variant
是一個數組元素,它可以是不同的類型。
我在“堆棧溢出”上找到了答案jedigo , iRon ,從中我很清楚應該將字節數組傳遞給write
方法:
$dom = New-Object -ComObject "HTMLFile"
[byte[]] $str = 84, 0, 101, 0, 120, 0, 116, 0 # "Text" in encoding UTF-16LE
$dom.write($str)
或同樣的事情:
$dom = New-Object -ComObject "HTMLFile"
$str = [Text.Encoding]::Unicode.GetBytes("Text") # UTF-16LE
$dom.write($str)
我的問題:人們怎么知道需要將字節數組傳遞給write
方法? 這不是從SAFEARRAY(Variant)
信息中得出的。 他們猜到了嗎? 他們是否通過不同的類型找到了答案? 有沒有可以在其中找到的文檔?
我需要知道這個問題的答案,因為如果將來我通過 COM 從“PowerShell”工作,那么我可能會遇到更多類似的情況,我需要知道傳遞給組件的變量類型。
TL/DR:您必須在文檔的幫助下知道或猜測。
從技術上講,傳遞 UTF-16 的字節數組並不是文檔所說的,但接收 function 可能會處理多種輸入格式。
如果我們查看IHTMLDocument2::write
的文檔,我們會發現它想要
BSTR 的 SAFEARRAY 指定要寫入的文本和 HTML 標記。
該頁面上的示例代碼執行以下操作:
...
SAFEARRAY *psaStrings = SafeArrayCreateVector(VT_VARIANT, 0, 1); // count is 1
VARIANT *param;
HRESULT hr = SafeArrayAccessData(psaStrings, (LPVOID*)¶m);
param->vt = VT_BSTR;
param->bstrVal = bstr; //SysAllocString
hr = SafeArrayUnaccessData(psaStrings);
hr = document->write(psaStrings);
這是一個 SAFEARRAY,在數組中有 1 個條目,一個 VARIANT。 該變體是 BSTR 類型。 BSTR 是一個計數的 WCHAR 數組,但通常可以視為 UTF-16LE 字符串。
當Powershell詢問COM時,關於BSTR的部分已經丟失。 數組項類型可能不是類型庫的一部分。
一些 COM 函數將只接受一個變體類型,而其他函數可能支持多個。 對多個的支持可能會手動編碼為有限的集合,或者它可能會調用VariantChangeType
(不太可能)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.