我在Powershell中编写了很多脚本,现在想修改一些Microsoft Word文档。我注意到我的脚本在某些服务器上运行很快,而在其他服务器上运行非常慢。经过进一步分析,似乎为某些用户配置文件使用Word.Application COMObject的速度很快,但是对于同一服务器上的其他一些用户配置文件,它的运行速度却非常慢。
同时,我仅用几行代码就可以重新创建问题-基本上每个方法或 Action 似乎都受到影响。
这是我在做什么:
没什么特别的,没有火箭科学-但是在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有关?也许是错误,我需要特定的修补程序/补丁?
最佳答案
如果您仅处理开放的XML文档,我建议您改用Open XML SDK。有关更多信息,请参见Welcome to the Open XML SDK 2.5 for Office。
事实是 Microsoft当前不建议并且不支持从任何无人参与的非交互客户端应用程序或组件(包括ASP,ASP.NET,DCOM和NT Services)自动化Microsoft Office应用程序,因为Office可能在此环境中运行Office时,将表现出不稳定的行为和/或死锁。
如果要构建在服务器端上下文中运行的解决方案,则应尝试使用对无人值守执行安全的组件。或者,您应该尝试找到允许至少部分代码在客户端运行的替代方法。如果您使用服务器端解决方案中的Office应用程序,则该应用程序将缺少许多成功运行所需的功能。此外,您将承担整体解决方案稳定性的风险。在MSDN中的Considerations for server-side Automation of Office文章中了解有关此内容的更多信息。
关于performance - 对于某些用户配置文件,在Powershell中使用Word.Application的速度非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33306266/