Мой текущий сценарий 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
макрос или отображающий какой-либо вид диалоговой подсказки?
Детали среды:
Оказывается, это НАМНОГО проще сделать в 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
Module1
и вставьте указанный выше код. путь к $ wordprinterpath
. $ doc
и $ принтер
соответственно. $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
Вам должно быть хорошо, если вы это сделаете. Я не тестировал печатную часть этого, поэтому может потребоваться некоторая работа, но отключение автоматических макросов и открытие документа работают.
Проблема, с которой вы столкнулись, задокументирована в KB-886633 (не важно, что речь идет об Office для Mac - то же самое относится и к ПК):
Дополнительно , если макрос пытается открыть файл, содержащий макрос, попытка не удастся, если оба выполняются следующие условия:
- Параметр свойства Application.AutomationSecurity установлен на
msoAutomationSecurityForceDisable.- Попытка открыть файл выполняется с помощью макроса Office API. Сюда входят макросы, которые написано на VBA, XLM в Excel и WordBasic в Word.
Оба пункта относятся к вашему сценарию.
Я знаю, что единственный способ обойти это - пойти по старинке - с помощью WordBasic , чтобы отключить все автоматические макросы ( AutoOpen
, AutoExec
, так далее.). Вставьте $ word.WordBasic.DisableAutoMacros
прямо перед $ word.AutomationSecurity = "msoAutomationSecurityForceDisable"
. Обратите внимание, что в VBA нет эквивалента этой подпрограмме.
Я пробовал несколько разных вещей ...
Предполагается, что вы можете использовать $word.WordBasic.DisableAutoMacros(1)
, но PowerShell плохо работает с COM, потому что вы не можете (действительно) приводить к интерфейсам в PowerShell, и поэтому приведение COM-объекта к интерфейсу IDispatch, который вам нужен, кажется безнадежным, и я не вижу способа сделать это. Брэндон (BSonPosh) и я только что отказались от этого для сетевого интерфейса, который он пытался использовать, и прибегли к Add-Type, чтобы встроить немного C# для вызова метода в его случае. Скорее всего, это сработает и здесь...
Что МОГЛО бы сработать (я уверен), так это автоматизация нажатия на кнопку. Вы можете использовать System.Windows.UIAutomation или модуль PowerShell WASP, чтобы сделать это довольно просто.
Не знаю, сработает ли это, просто идея: не могли бы вы загрузить и использовать Wordviewer ? Это не выполняет макросы, поэтому, вероятно, не будет отображаться предупреждение. Однако я не знаю, можно ли его вызвать через API.