Как открыть документ, который содержит макрос AutoOpen с PowerShell?

Мой текущий сценарий PowerShell:

$document = "C:\\test.doc"
$word = new-object -comobject word.application
$word.Visible = $false
$word.DisplayAlerts = "wdAlertsNone"
$word.AutomationSecurity = "msoAutomationSecurityForceDisable"
$doc = $word.Documents.Open($document)
$word.ActivePrinter = "\\http://ptr-server:631\pdf-printer"
$background = $false
$doc.PrintOut([ref]$background)
$doc.close([ref]$false)
$word.quit()

Но это приводит к окну предупреждений, макросы в этом проекте отключены. См. справку онлайн или документацию хост-приложения, чтобы определить, как включить макросы.

Как я могу открыть документ без него работающий AutoOpen макрос или отображающий какой-либо вид диалоговой подсказки?

Детали среды:

  • Word 2003 SP3
  • Windows Server 2003 R2 - Standard Edition - пакет обновления 2
  • Версия 1.0 Powershell
6
задан Todd Main 22 July 2010 в 16:58
поделиться

4 ответа

Оказывается, это НАМНОГО проще сделать в VB.NET, чем в C # (чего я никогда не мог понять). Но все, что вам нужно сделать, это создать, скажем, консольное приложение с единственной процедурой. Вот инструкции:

Код

Imports word = Microsoft.Office.Interop.Word
Module Module1
    Sub Main()
        Dim args() As String = Environment.GetCommandLineArgs
        Dim path = args(1)
        Dim printer = args(2)
        Dim wordApp As word.Application = New word.Application
        wordApp.WordBasic.DisableAutoMacros(1)
        wordApp.Visible = False
        Dim doc As word.Document = wordApp.Documents.Open(path)
        wordApp.ActivePrinter = printer
        Dim background As Object = False
        doc.PrintOut(background)
        doc.Close(False)
        wordApp.WordBasic.DisableAutoMacros(0)
        wordApp.Quit()
    End Sub
End Module

Шаги по воссозданию решения:

  1. Откройте VS2008 и создайте новую консоль Приложение в VB.NET.
  2. Установите ссылку на Microsoft.Office.Interop.Word (версия 11)
  3. Удалите любой код в Module1 и вставьте указанный выше код.
  4. Сохраните проект и назовите его «wordprinter». Постройте проект.
  5. Перейдите в папку Release, возьмите «wordprinter.exe» и поместите его куда угодно. Это будет ваш путь к $ wordprinterpath .
  6. Запишите пути к вашему документу и принтеру. Это будет ваш $ doc и $ принтер соответственно.
  7. Введите следующее в PS:
        $wordprinterpath = "C:\\path\\wordprinter.exe"
        $doc ="""C:\\Users\\me\\Documents\\Your doc.doc"""
        $printer = "\\http://ptr-server:631\pdf-printer"
        Invoke-Expression "$wordprinterpath $doc $printer" | out-Null

Вам должно быть хорошо, если вы это сделаете. Я не тестировал печатную часть этого, поэтому может потребоваться некоторая работа, но отключение автоматических макросов и открытие документа работают.

4
ответ дан 8 December 2019 в 18:33
поделиться

Проблема, с которой вы столкнулись, задокументирована в KB-886633 (не важно, что речь идет об Office для Mac - то же самое относится и к ПК):

Дополнительно , если макрос пытается открыть файл, содержащий макрос, попытка не удастся, если оба выполняются следующие условия:

  • Параметр свойства Application.AutomationSecurity установлен на
    msoAutomationSecurityForceDisable.
  • Попытка открыть файл выполняется с помощью макроса Office API. Сюда входят макросы, которые написано на VBA, XLM в Excel и WordBasic в Word.

Оба пункта относятся к вашему сценарию.

Я знаю, что единственный способ обойти это - пойти по старинке - с помощью WordBasic , чтобы отключить все автоматические макросы ( AutoOpen , AutoExec , так далее.). Вставьте $ word.WordBasic.DisableAutoMacros прямо перед $ word.AutomationSecurity = "msoAutomationSecurityForceDisable" . Обратите внимание, что в VBA нет эквивалента этой подпрограмме.

4
ответ дан 8 December 2019 в 18:33
поделиться

Я пробовал несколько разных вещей ...

Предполагается, что вы можете использовать $word.WordBasic.DisableAutoMacros(1), но PowerShell плохо работает с COM, потому что вы не можете (действительно) приводить к интерфейсам в PowerShell, и поэтому приведение COM-объекта к интерфейсу IDispatch, который вам нужен, кажется безнадежным, и я не вижу способа сделать это. Брэндон (BSonPosh) и я только что отказались от этого для сетевого интерфейса, который он пытался использовать, и прибегли к Add-Type, чтобы встроить немного C# для вызова метода в его случае. Скорее всего, это сработает и здесь...

Что МОГЛО бы сработать (я уверен), так это автоматизация нажатия на кнопку. Вы можете использовать System.Windows.UIAutomation или модуль PowerShell WASP, чтобы сделать это довольно просто.

1
ответ дан 8 December 2019 в 18:33
поделиться

Не знаю, сработает ли это, просто идея: не могли бы вы загрузить и использовать Wordviewer ? Это не выполняет макросы, поэтому, вероятно, не будет отображаться предупреждение. Однако я не знаю, можно ли его вызвать через API.

1
ответ дан 8 December 2019 в 18:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: