很久以前,我创建了一个COM类,该类执行一些操作并提供回调注册:
HRESULT RegisterCallback([in] IUnknown* callbackFunction);
callbackFunction
的类型可以为IDispatch
或ICallbackHandler
interface IActionCallbackHandler : IUnknown {
[id(1)] HRESULT ActionCallback(IActionCallbackData* data);
};
IDispatch
用于将VBScript子例程注册为回调方法,例如:
Sub ProgressCallback (data)
WScript.Echo data.Message
End sub
Set myObj= CreateObject("MyClass.MyClass")
myObj.RegisterCallback GetRef("ProgressCallback")
myObj.DoSomeActions //this method will call ProgressCallback()
但是,工程师试图摆脱VBScript并使用powershell替换所有内容。除回调外,所有内容均在Powershell中运行。因此,没有任何进展,他们也无法记录。
如何在Powershell中实现此回调?以与VBScript中相同的方式引用Powershell函数将是完美的。这样,他们仍然可以使用其日志记录对象等。
答案 0 :(得分:0)
以您的vbs示例为例:
Sub ProgressCallback (data)
WScript.Echo data.Message
End sub
Set myObj= CreateObject("MyClass.MyClass")
myObj.RegisterCallback GetRef("ProgressCallback")
myObj.DoSomeActions //this method will call ProgressCallback()
您应该能够像这样在powershell中执行此操作:
$obj = New-Object -ComObject MyClass.MyClass
$obj.RegisterCallback({param($data) $data.Message})
$obj.DoSomeActions()
如果您的目标是将其定义为一个函数(因为您将在其他地方重用它),则必须访问Function
驱动器以获取脚本块定义:
function ProgressCallback
{
param($data)
$data.Message
}
$obj.RegisterCallback($Function:ProgressCallback)