2016-08-17 81 views
-1

这对SQL没有任何问题。它是在创建rtf对象时。如何在PowerShell中解决此错误?例外设置“Rtf”:“创建窗口句柄时出错。”

我连接到一个sql数据库并提取信息。其中一些信息是html,rtf和纯文本。经过约10分钟的运行我得到这个:

Exception setting "Rtf": "Error creating window handle." 
At line:24 char:76 
+ ... Name System.Windows.Forms.RichTextBox; $rtf.Rtf = $convo.Body; $body ... 
+           ~~~~~~~~~~~~~~~~~~~~~~ 
+ CategoryInfo   : NotSpecified: (:) [], SetValueInvocationException 
+ FullyQualifiedErrorId : ExceptionWhenSetting 

有没有人遇到过这个问题?

这是脚本本身。

#Who are you searching for? 
#Example User ID: [email protected] 
$Subject = "[email protected]" 

#Set the date to search from 
#Example date format: 2016-08-16. 
#Leave it blank if you don't want to search for just dates. 
$Date = "" 

#Blank array to store the conversation history 
$arr = @() 

#Lync Archive Server 
$SQLSvr = "ServerName Goes Here" 

#Lync Archive Database 
$Database = "LcsLog" 

#Get the UserId's 
$UserUri = Invoke-Sqlcmd -Query "Select UserUri,UserId From dbo.Users u;" -ServerInstance $SQLSvr -Database $Database 

#Build the Select Statement 
$select = "Select * from dbo.Users d left join dbo.Messages m on FromId = d.UserId or ToId = d.UserId Where d.UserUri = '$Subject' " 
if($Date) 
{ 
    $select = $select +"and m.MessageIdTime >= '$Date 00:00:01.550' order by m.MessageIdTime asc;" 
} 
else 
{ 
    $select = $select + "order by m.MessageIdTime asc;" 
} 

#Get the conversation history 
$ConvoData = Invoke-Sqlcmd -Query ($select) -ServerInstance $SQLSvr -Database $Database; 

#Loop through each conversation 
foreach($convo in $ConvoData) 
{ 
    #Loop through each user. 
    foreach($user in $UserUri) 
    { 
     #Verify the FromId 
     if($convo.FromId -eq $user.UserId) 
     { 
      $FromID = $user.UserUri 
     } 

     #Verify the ToId 
     if($convo.ToId -eq $user.UserId) 
     { 
      $ToId = $user.UserUri 
     } 
    } 

#Parse the body for legible reading 
switch ($convo.ContentTypeId) 
{ 
    '1' {$html = New-Object -ComObject "HTMLFile"; $html.IHTMLDocument2_write($convo.Body);$body = $html.IHTMLDocument2_body.innerText; $html.close();} 
    '2' {$rtf = New-Object -TypeName System.Windows.Forms.RichTextBox; $rtf.Rtf = $convo.Body; $body = $rtf.Text; $rtf.Clear();} 
    '3' {$body = $convo.Body} 
} 

    #Build the Message Output 
    $obj = New-Object -TypeName psobject -Property @{User = $Subject; "Message Time" = $convo.MessageIdTime; From = $FromID; To = $ToId; Body = $body} 

    #Add data to the array 
    $arr += $obj 
} 

$arr | Select User,"Message Time",From,To,Body | Export-csv "$env:userprofile\desktop\$Subject - conversation report.csv" 
+0

的可能的复制[SQL Server 2008中:错误创建窗口句柄(http://stackoverflow.com/questions/37064620/sql-server-2008-error-creating-window-handle) –

+0

不一样问题 – Fidelis

+0

看起来像是因为内容太多而导致资源过载是有道理的,但我想不是。 –

回答

0

我想通了。通过在开始时创建一个RTF对象实例来纠正我的错误。

#Who are you searching for? 
#Example User ID: [email protected] 
$Subject = "[email protected]" 

#Set the date to search from 
#Example date format: 2016-08-16. 
#Leave it blank if you don't want to search for just dates. 
$Date = "" 

#Blank array to store the conversation history 
$arr = @() 

#Create RTF and HTML Objects 
$html = New-Object -ComObject "HTMLFile"; 
$rtf = New-Object -TypeName System.Windows.Forms.RichTextBox; 

#Lync Archive Server 
$SQLSvr = "Server Name goes here" 

#Lync Archive Database 
$Database = "LcsLog" 

#Get the UserId's 
$UserUri = Invoke-Sqlcmd -Query "Select UserUri,UserId From dbo.Users u;" -ServerInstance $SQLSvr -Database $Database 

#Build the Select Statement 
$select = "Select * from dbo.Users d left join dbo.Messages m on FromId = d.UserId or ToId = d.UserId Where d.UserUri = '$Subject' " 
if($Date) 
{ 
    $select = $select +"and m.MessageIdTime >= '$Date 00:00:01.550' order by m.MessageIdTime asc;" 
} 
else 
{ 
    $select = $select + "order by m.MessageIdTime asc;" 
} 

#Get the conversation history 
$ConvoData = Invoke-Sqlcmd -Query ($select) -ServerInstance $SQLSvr -Database $Database; 

#Loop through each conversation 
foreach($convo in $ConvoData) 
{ 
    #Loop through each user. 
    foreach($user in $UserUri) 
    { 
     #Verify the FromId 
     if($convo.FromId -eq $user.UserId) 
     { 
      $FromID = $user.UserUri 
     } 

     #Verify the ToId 
     if($convo.ToId -eq $user.UserId) 
     { 
      $ToId = $user.UserUri 
     } 
    } 

    #Parse the body for legible reading 
    switch ($convo.ContentTypeId) 
    { 
     '1' {$html.IHTMLDocument2_write($convo.Body);$body = $html.IHTMLDocument2_body.innerText; $html.close();} 
     '2' {$rtf.Rtf = $convo.Body; $body = $rtf.Text; $rtf.Clear();} 
     '3' {$body = $convo.Body} 
    } 

    #Build the Message Output 
    $obj = New-Object -TypeName psobject -Property @{User = $Subject; "Message Time" = $convo.MessageIdTime; From = $FromID; To = $ToId; Body = $body} 

    #Add data to the array 
    $arr += $obj 
} 

$arr | Select User,"Message Time",From,To,Body | Export-csv "$env:userprofile\desktop\$Subject - conversation report.csv" 
+0

“'2' {rtf = New-Object -TypeName System.Windows.Forms.RichTextBox $ rtf.Rtf = $ convo.Body $ body = $ rtf。文本 $ rtf.Clear() }' –

0

不是一个真正的答案,而是一个建议,你应该把你的参数变成一个Param块。如果您想从命令行调用脚本或将其转换为函数,它会更有用。

Param (
    # Parameter Subject 
    [Parameter(Mandatory = $true, 
       HelpMessage = 'Who are you searching for? e.g. User ID: [email protected]')] 
    $Subject = '[email protected]', 
    # Parameter Date 
    [Parameter(HelpMessage = 'Set the date to search from. e.g. "2016-08-16"')] 
    [String] 
    $Date, 
    # Parameter SQLSvr 
    [Parameter(Mandatory = $true, 
       HelpMessage = 'ServerName Goes Here')] 
    $SQLSvr, 
    # Parameter Database 
    [Parameter(Mandatory = $true, 
       HelpMessage = 'Lync Archive Database')] 
    $Database = 'LcsLog' 
) 
+0

谢谢你的回应,但是,我的问题是构建对象,并发现当我看着堆时它超载。一旦我发现我创建了一次实例并更新了该实例。 – Fidelis

+0

听起来很像“SQL Server 2008的可能重复:创建窗口句柄时出错” –

+0

不,该问题必须处理MSSQL专用命令行:'执行批处理时发生错误。错误消息是:创建窗口句柄时出错。'这个错误必须处理输出。我的脚本收集所有数据并将其存储到一个没有问题的数组中。输出收集并保存良好。 RTF对象实例被重载,因为我一直在创建实例。通过将其控制为一个实例,它解决了问题 – Fidelis

相关问题