在Powershell中使用Word.Application对某些用户配置文件来说非常慢

时间:2015-10-23 15:33:31

标签: performance powershell ms-word office-interop com-interop

我在Powershell中编写了大量脚本,现在想要修改一些Microsoft Word文档。我注意到我的脚本在某些服务器上运行速度很快,而在其他服务器上运行速度非常慢。经过进一步分析后,似乎使用Word.Application COMObject来处理某些用户配置文件的速度很快,但对于同一服务器上的其他一些用户配置文件来说速度非常慢。

与此同时,我只用几行代码就可以重新创建问题 - 基本上每种方法或行动都会受到影响。

这就是我在做的事情:

  • 打开新文档
  • 添加一些文字
  • 等待5秒
  • 再添加一些文字

没有什么特别的,没有火箭科学 - 但是在5秒暂停后用言语做任何事都几乎是不可能的。

这是我的代码:

$WordApp1 = New-Object -ComObject Word.Application 
$Word1 = $WordApp1.Documents.Add()
$WordApp1.Visible=$true
$selection=$WordApp1.Selection
(Measure-Command {$selection.TypeText("test")}).TotalMilliseconds
(Measure-Command {$selection.TypeText("test")}).TotalMilliseconds
(Measure-Command {$selection.TypeText("test")}).TotalMilliseconds
(Measure-Command {$selection.TypeText("test")}).TotalMilliseconds
(Measure-Command {$selection.TypeText("test")}).TotalMilliseconds
Start-Sleep -Seconds 5
(Measure-Command {$selection.TypeText("test")}).TotalMilliseconds
(Measure-Command {$selection.TypeText("test")}).TotalMilliseconds
(Measure-Command {$selection.TypeText("test")}).TotalMilliseconds

结果是:

77.3065    
91.4125    
63.3547   
80.9694  
71.1408   
87.1482    
10491.071          <----- LOOK HOW LONG IT TOOK    
10329.0877        <----- LOOK HOW LONG IT TOOK

为什么会发生这种情况,我该如何避免呢?

我已经尝试过使用书签,查找/替换和MailMerge具有相同的奇怪行为。我做了“修复安装”并重置Word用户设置而没有改进。

VBA中的相同代码运行良好且快速,因此必须与Powershell或Word类有关系。 Word是2010,Powershell 4.0,Server 2008R2。发生在多个服务器上但仅适用于某些用户配置文件。受影响的用户配置文件具有本地管理员权限。

也许它与Interop.class有关?也许是一个错误,我需要一个特定的修补程序/补丁?

1 个答案:

答案 0 :(得分:0)

如果您只处理打开的XML文档,我建议使用Open XML SDK。有关详细信息,请参阅Welcome to the Open XML SDK 2.5 for Office

事实是, Microsoft目前不建议并且不支持从任何无人参与的非交互式客户端应用程序或组件(包括ASP,ASP.NET,DCOM和NT服务)自动化Microsoft Office应用程序),因为Office在此环境中运行时可能会出现不稳定的行为和/或死锁。

如果要构建在服务器端上下文中运行的解决方案,则应尝试使用已为安全无人值守执行的组件。或者,您应该尝试找到允许至少部分代码在客户端运行的替代方法。如果从服务器端解决方案使用Office应用程序,则应用程序将缺少许多成功运行的必要功能。此外,您将承担整体解决方案稳定性的风险。在MSDN的Considerations for server-side Automation of Office文章中了解更多相关信息。