Работа с Word.Application в Powershell ужасно медленная для определенных профилей пользователей.

Я много пишу в 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 ответ

Вместо этого я бы предложил использовать Open XML SDK, если вы имеете дело только с открытыми XML-документами. См. Добро пожаловать в Open XML SDK 2.5 для Office для получения дополнительной информации.

Дело в том, что Microsoft в настоящее время не рекомендует и не поддерживает автоматизацию приложений Microsoft Office из любых необслуживаемых, неинтерактивных клиентских приложений или компонентов (включая ASP, ASP.NET, DCOM и NT Services), поскольку Office может демонстрировать нестабильное поведение и / или взаимоблокировка при работе Office в этой среде.

Если вы создаете решение, работающее в контексте сервера, вы должны попытаться использовать компоненты, которые были сделаны безопасными для автоматического выполнения. Или вы должны попытаться найти альтернативы, которые позволяют хотя бы части кода работать на стороне клиента. Если вы используете приложение Office из серверного решения, приложению не хватит многих необходимых возможностей для успешной работы. Кроме того, вы будете рисковать стабильностью вашего общего решения. Подробнее об этом читайте в статье " Вопросы автоматизации сервера Office" в MSDN.

Другие вопросы по тегам