Powershell COM对象

时间:2011-03-29 17:54:08

标签: com powershell outlook

我试图通过Powershell从共享日历中获取日历项目,代码如下:

$outlook = new-object -ComObject Outlook.application
$session = $outlook.Session
$session.Logon("Outlook")
$namespace = $outlook.GetNamespace("MAPI")
$recipient = $namespace.CreateRecipient("John Smith")
$theirCalendar = $namespace.GetSharedDefaultFolder($recipient, "olFolderCalendar")

但是我遇到了类型不匹配错误:

  

无法转换参数“0”,值为:“System .__ ComObject”,“GetSharedDefaultFolder”键入“Microsoft.Office.I”   nterop.Outlook.Recipient“:”无法转换“System .__ ComObject”类型“System .__ ComObject#{00063045-0000-00”的值   00-c000-000000000046}“输入”Microsoft.Office.Interop.Outlook.Recipient“。”   在行:1 char:34   + $ namespace.GetSharedDefaultFolder<<<< ($ recip,“olFolderCalendar”)       + CategoryInfo:NotSpecified:(:) [],MethodException       + FullyQualifiedErrorId:MethodArgumentConversionInvalidCastArgument

我已尝试直接将$收件人投放到Microsoft.Office.Interop.Outlook.Recipient,这不起作用,我也尝试了invoke-method()此处详细记录的程序:http://www.mcleod.co.uk/scotty/powershell/COMinterop.htm

似乎后者应该有效,但它似乎没有GetSharedDefaultFolder()所需的多个参数的规定。

3 个答案:

答案 0 :(得分:3)

我已经设法使用System .__ ComObject的InvokeMember方法来实现此功能。为了将多个参数传递给方法,只需将它们括在括号中即可。

此处显示了一行代码示例:

PS C:> $ usercontacts = [System .__ ComObject] .InvokeMember(“GetSharedDefaultFolder”[System.Reflection.BindingFlags] :: InvokeMethod,$ null,$ mapi,($ user,10))

$ user是先前设置的收件人对象。 $ mapi是MAPI命名空间对象(也是先前设置的)。

答案 1 :(得分:0)

尝试使用数字olFolderCalendar替换9 COM对象需要实际值。它们无法将明文名称转换为常量值。

答案 2 :(得分:0)

在此处找到解决方案:http://cjoprey.blog.com/2010/03/09/getting-another-users-outlook-folder/

Add-Type -AssemblyName Microsoft.Office.Interop.Outlook

$class = @”
using Microsoft.Office.Interop.Outlook;public class MyOL
{
    public MAPIFolder GetCalendar(string userName)
    {
        Application oOutlook = new Application();
        NameSpace oNs = oOutlook.GetNamespace("MAPI");
        Recipient oRep = oNs.CreateRecipient(userName);
        MAPIFolder calendar = oNs.GetSharedDefaultFolder(oRep, OlDefaultFolders.olFolderCalendar);
        return calendar;
    }
}
“@

Add-Type $class -ReferencedAssemblies Microsoft.Office.Interop.Outlook