如何使用PowerShell打开包含AutoOpen宏的文档?

时间:2010-05-17 02:55:30

标签: powershell ms-word

我当前的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 - 标准版 - Service Pack 2
  • Powershell版本1.0

6 个答案:

答案 0 :(得分:4)

您正在解决的问题记录在KB-886633(没关系,它正在谈论Office for Mac - 同样适用于PC):

  

此外,如果宏试图打开   一个包含宏的文件,   如果两者都尝试将失败   以下条件属实:

     
      
  • Application.AutomationSecurity属性选项设置为
      msoAutomationSecurityForceDisable。
  •   
  • 尝试打开文件是通过Office API宏进行的。   这包括宏   用VBA编写,XLM用Excel编写   Word中的WordBasic。
  •   

两个要点都适用于您的脚本。

我知道解决这个问题的唯一方法是使用 WordBasic 去老派 - 禁用所有自动宏(AutoOpenAutoExec等) 。在$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

重新创建解决方案的步骤:

  1. 打开VS2008并创建一个新的控制台 在VB.NET中的应用。
  2. 设置对 Microsoft.Office.Interop.Word (版本11)的引用
  3. 删除Module1中的所有代码并插入上面的代码。
  4. 保存项目并将其命名为“wordprinter”。建立项目。
  5. 导航到Release文件夹并抓住“wordprinter.exe”并将其放在任何您喜欢的位置。这将是您的$wordprinterpath
  6. 请注意文档和打印机的路径。这将分别是您的$doc$printer
  7. 在PS中输入以下内容:
  8.         $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是动态。但这对我有用;由于某些宏中的某些错误而弹出的所有错误消息都消失了。