【问题标题】:Powershell in UIPath. Throw : Unable to cast object of type 'Microsoft.Exchange.WebServices.Data.GetItemResponse' to type 'System.String'UIPath 中的 Powershell。抛出:无法将“Microsoft.Exchange.WebServices.Data.GetItemResponse”类型的对象转换为“System.String”类型
【发布时间】:2018-12-04 13:38:43
【问题描述】:

我正在尝试在 UI 路径中使用 powershell 从 Exchange 获取电子邮件。尝试退货时,出现以下错误:

抛出:无法将“Microsoft.Exchange.WebServices.Data.GetItemResponse”类型的对象转换为“System.String”类型。

即使我更改 UI 路径中的 TypeArgument。目前我正在使用 Invoke power shell 活动,但使用 RunPowershellScript 活动时遇到了同样的问题。下面是我在 UI Path 中的序列、我的参数和我的 powershell 脚本的截图,谢谢!

Param(
[parameter()]
[string]$mailbox,

[parameter()]
[string]$password
)
try{
#https://forum.uipath.com/t/get-argument-from-an-process-with-exception-in-reframework/22537/4
function test-password(){
                $Creds = new-object System.Net.networkCredential -ArgumentList $mailbox, $password

                $mailFolder = "Inbox"
                $itemView = 3

                #[Reflection.Assembly]::LoadFile("C:\Program Files\Microsoft\Exchange\Web Services\2.2\Microsoft.Exchange.WebServices.dll")
                $ExSer = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2010_SP1)
                $ExSer.Credentials = ($Creds)
                $ExSer.Url = new-object Uri("https://outlook.office365.com/EWS/Exchange.asmx")
                $ExSer.AutodiscoverUrl($mailbox, {$true})


                $setMailFolder = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($ExSer,[Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox)
                $logs2 += "Successfully Connected to mailbox $mailbox"

                $iv = new-object Microsoft.Exchange.WebServices.Data.ItemView($itemView)

                $CustomFilter = new-object Microsoft.Exchange.WebServices.Data.SearchFilter+SearchFilterCollection([Microsoft.Exchange.WebServices.Data.LogicalOperator]::And)

                $ifIsRead = new-object Microsoft.Exchange.WebServices.Data.SearchFilter+IsEqualTo([Microsoft.Exchange.WebServices.Data.EmailMessageSchema]::IsRead,$false)
                $ifFrom = new-object Microsoft.Exchange.WebServices.Data.SearchFilter+IsEqualTo([Microsoft.Exchange.WebServices.Data.EmailMessageSchema]::From,"filteremail@mycompany.com")

                $CustomFilter.add($ifIsRead)
                $CustomFilter.add($ifFrom)

                $filteredEmails = $ExSer.FindItems($setMailFolder.Id,$CustomFilter, $iv)

                $psPropertySet = new-object Microsoft.Exchange.WebServices.Data.PropertySet([Microsoft.Exchange.WebServices.Data.BasePropertySet]::FirstClassProperties)
                $psPropertySet.RequestedBodyType = [Microsoft.Exchange.WebServices.Data.BodyType]::Text;
                #add-type "Microsoft.Exchange.WebServices.Data.GetItemResponse"
                $ExSer.LoadPropertiesForItems($filteredEmails,$psPropertySet)

                $item = $filteredEmails.Items[0]

                return $mailbox, $item
    }               


   test-password
}
catch{
        Throw
}

我注释掉了加载 dll,因为它似乎在没有它的情况下也能工作,并且在遇到它时抛出了类似的错误。代码在遇到 $Exser.LoadPropertyItems 时似乎引发了错误。我也尝试过切换到 Exchange 2007 等。澄清一下,当在 UI 路径之外运行纯 powershell 时,这段代码工作得很好。

【问题讨论】:

  • 正如错误所说,它期望字符串但得到不同的类型?过滤项中有什么?
  • 我假设它是一个使用这种类型的电子邮件对象 Microsoft.Exchange.WebServices.Data.GetItemResponse
  • 或 Microsoft.Exchange.WebServices.Data.EmailMessage 的列表

标签: powershell invoke exchange-server-2010 uipath


【解决方案1】:

我想通了....我只是在做一个傻瓜。它试图加载一个对象,这会破坏它。如果我将它保存为变量,然后在我的脚本中转换它并返回我需要的字符串......你猜怎么着?它可以理解字符串。下面是我更新的 powershell。

 Param(
[parameter()]
[string]$mailbox,

[parameter()]
[string]$password
)
try{
#https://forum.uipath.com/t/get-argument-from-an-process-with-exception-in-reframework/22537/4
function test-password(){

                $Creds = new-object System.Net.networkCredential -ArgumentList $mailbox, $password

                $mailFolder = "Inbox"
                $itemView = 50

               # Add-Type -Path "C:\Program Files\Microsoft\Exchange\Web Services\2.2\Microsoft.Exchange.WebServices.dll"
                #[Reflection.Assembly]::LoadFile("C:\Program Files\Microsoft\Exchange\Web Services\2.2\Microsoft.Exchange.WebServices.dll")
                $ExSer = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2010_SP1)
                $ExSer.Credentials = ($Creds)
                $ExSer.Url = new-object Uri("https://outlook.office365.com/EWS/Exchange.asmx")
                $ExSer.AutodiscoverUrl($mailbox, {$true})


                $setMailFolder = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($ExSer,[Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox)
                $logs2 += "Successfully Connected to mailbox $mailbox"

                $iv = new-object Microsoft.Exchange.WebServices.Data.ItemView($itemView)

                $CustomFilter = new-object Microsoft.Exchange.WebServices.Data.SearchFilter+SearchFilterCollection([Microsoft.Exchange.WebServices.Data.LogicalOperator]::And)

                $ifIsRead = new-object Microsoft.Exchange.WebServices.Data.SearchFilter+IsEqualTo([Microsoft.Exchange.WebServices.Data.EmailMessageSchema]::IsRead,$true)
                $ifFrom = new-object Microsoft.Exchange.WebServices.Data.SearchFilter+IsEqualTo([Microsoft.Exchange.WebServices.Data.EmailMessageSchema]::From,"emailtofilterby@mycompany.com")

                $CustomFilter.add($ifIsRead)
                $CustomFilter.add($ifFrom)

                $filteredEmails = $ExSer.FindItems($setMailFolder.Id,$CustomFilter, $iv)

                $psPropertySet = new-object Microsoft.Exchange.WebServices.Data.PropertySet([Microsoft.Exchange.WebServices.Data.BasePropertySet]::FirstClassProperties)
                $psPropertySet.RequestedBodyType = [Microsoft.Exchange.WebServices.Data.BodyType]::Text;
                #add-type "Microsoft.Exchange.WebServices.Data.GetItemResponse"
                $FilteredEmailitems = $ExSer.LoadPropertiesForItems($filteredEmails,$psPropertySet) 


                $EmailBody = $FilteredEmailitems.Item(0) | Select-Object -ExpandProperty Item | Select-Object -ExpandProperty Body | Select-Object -ExpandProperty Text

                return $EmailBody
    }               


   test-password
}
catch{
        Throw
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-07
    • 2014-03-14
    • 2017-11-24
    • 1970-01-01
    • 2021-04-26
    • 2017-03-04
    • 1970-01-01
    相关资源
    最近更新 更多