我当前的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
宏或显示任何类型的对话框提示的情况下打开文档?
环境详情:
答案 0 :(得分:4)
您正在解决的问题记录在KB-886633(没关系,它正在谈论Office for Mac - 同样适用于PC):
此外,如果宏试图打开 一个包含宏的文件, 如果两者都尝试将失败 以下条件属实:
- Application.AutomationSecurity属性选项设置为
msoAutomationSecurityForceDisable。- 尝试打开文件是通过Office API宏进行的。 这包括宏 用VBA编写,XLM用Excel编写 Word中的WordBasic。
两个要点都适用于您的脚本。
我知道解决这个问题的唯一方法是使用 WordBasic 去老派 - 禁用所有自动宏(AutoOpen
,AutoExec
等) 。在$word.WordBasic.DisableAutoMacros
之前插入$word.AutomationSecurity = "msoAutomationSecurityForceDisable"
。请注意,VBA中没有与此例程等效的内容。
答案 1 :(得分: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
Module1
中的所有代码并插入上面的代码。$wordprinterpath
。$doc
和$printer
。$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
你应该善于追求这一点。我还没有测试过这部分的打印部分,因此可能需要一些工作,但是禁用自动宏并打开文档可以正常工作。
答案 2 :(得分:2)
要在C#中禁用宏,我最终确定了以下内容,它似乎对我有用..
wordApp = new Microsoft.Office.Interop.Word.Application();
wordApp.Application.AutomationSecurity = MsoAutomationSecurity.msoAutomationSecurityForceDisable;
现在我希望能够触发编译检查(没有sendkeys)但这是另一个问题;)
答案 3 :(得分:1)
我不知道这是否有用,只是一个想法:你能下载并使用Wordviewer吗?这不执行宏,因此可能不会显示警告。但是,我不知道它是否可以通过API调用。
答案 4 :(得分:1)
我尝试了几件不同的事情......
你应该可以使用$word.WordBasic.DisableAutoMacros(1)
但是PowerShell在COM上很痛苦,因为你不能(真的)强制转换到PowerShell中的接口,因此,将COM对象转换为IDispatch接口你需要似乎无望,我无法看到这样做的方法。布兰登(BSonPosh)和我刚刚放弃了他试图使用的网络界面,并使用Add-Type嵌入一些C#来进行方法调用。那也很有可能在这里工作......
WOULD的工作(我相信)是自动点击按钮。您可以使用System.Windows.UIAutomation或PowerShell WASP模块来做到这一点。
答案 5 :(得分:1)
感谢上面的指示。我甚至在C#中使用.NET 4的新动态功能解决了这个问题。我所做的就是:
var word = new Microsoft.Office.Interop.Word.Application();
word.WordBasic.DisableAutoMacros();
显然没有intellisense支持提供DisableAutoMacros()的提示,因为WordBasic是动态。但这对我有用;由于某些宏中的某些错误而弹出的所有错误消息都消失了。