【问题标题】:How to open document that contains AutoOpen macro with PowerShell?如何使用 PowerShell 打开包含 AutoOpen 宏的文档?
【发布时间】:2012-02-27 20:34:57
【问题描述】:

我当前的 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 版

【问题讨论】:

  • 我很乐意对此进行更深入的研究,尤其是新的赏金,但需要有关您的环境的更多详细信息来解决为什么我在下面的第一个答案不起作用。什么版本的 PowerShell?什么版本的Word?什么操作系统?等等。
  • 如果我有代表,我什至会付出更大的赏金。我已经用尽谷歌的答案并且完全被卡住了。

标签: powershell ms-word


【解决方案1】:

事实证明,这在 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,新建一个Console VB.NET 中的应用。
  2. 设置对 Microsoft.Office.Interop.Word(版本 11)的引用
  3. 删除Module1中的任何代码并插入上面的代码。
  4. 保存项目并将其命名为“wordprinter”。构建项目。
  5. 导航到 Release 文件夹并获取“wordprinter.exe”并将其放在您喜欢的任何位置。这将是您的$wordprinterpath
  6. 记下文档和打印机的路径。这将分别是您的 $doc$printer
  7. 在 PS 中输入以下内容:
$wordprinterpath = "C:\\path\\wordprinter.exe" $doc ="""C:\\Users\\me\\Documents\\Your doc.doc""" $printer = "\\http://ptr-server:631\pdf-printer" 调用表达式“$wordprinterpath $doc $printer”|外空

你应该很好地追求这个。我还没有测试过这个的打印部分,所以可能需要做一些工作,但是禁用自动宏并打开文档是可行的。

【讨论】:

  • 如何将其提供给 PowerShell?
【解决方案2】:

您遇到的问题记录在 KB-886633 中(没关系,它是在谈论 Office for Mac - 这同样适用于 PC):

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

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

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

我知道解决它的唯一方法是老派 - 使用 WordBasic - 禁用所有自动宏(AutoOpenAutoExec 等)。在$word.AutomationSecurity = "msoAutomationSecurityForceDisable" 之前插入$word.WordBasic.DisableAutoMacros。请注意,在 VBA 中没有与此例程等效的程序。

【讨论】:

  • @grom - 除了AutoOpen 之外,你还有其他宏吗?另外,它是否仍然给您相同的提示或不同的提示?尝试设置为:$word.WordBasic.DisableAutoMacros -1 并在关闭文档之前设置为:$word.WordBasic.DisableAutoMacros -0
  • 当我尝试将值设置为 DisableAutoMacros 时,我得到:在此对象上找不到属性“DisableAutoMacros”
  • $word.WordBasic | Get-Member 也没有列出任何看起来有用的东西。
  • @grom:我在上面发表了评论。我很确定我们可以解决这个问题,如果您可以编辑它,只需要在您的帖子中提供更多详细信息。此外,除了 Auto 宏之外,您从未提及是否还有其他宏。
  • 不,只有 AutoOpen 一个
【解决方案3】:

为了禁用 C# 中的宏,我最终选择了以下方法,它似乎对我有用..

wordApp = new Microsoft.Office.Interop.Word.Application();
wordApp.Application.AutomationSecurity = MsoAutomationSecurity.msoAutomationSecurityForceDisable;

现在我希望能够触发编译检查(没有发送键),但这是另一个问题;)

【讨论】:

    【解决方案4】:

    我不知道这是否可行,只是一个想法:您可以下载并使用Wordviewer吗?这不会执行宏,因此可能不会显示警告。不过不知道能不能通过API调用。

    【讨论】:

      【解决方案5】:

      我尝试了一些不同的东西......

      你应该能够使用$word.WordBasic.DisableAutoMacros(1),但 PowerShell 在 COM 上很糟糕,因为你不能(真的)转换为 PowerShell 中的接口,因此,将 COM 对象转换为你需要的 IDispatch 接口似乎没有希望,我看不出有办法做到这一点。 Brandon (BSonPosh) 和我刚刚放弃了他试图使用的网络接口,并求助于 Add-Type 嵌入一些 C# 来在他的案例中进行方法调用。这很可能也适用于这里......

      什么会起作用(我敢肯定)是自动点击按钮。您可以使用 System.Windows.UIAutomation 或 PowerShell WASP 模块非常简单地做到这一点。

      【讨论】:

      • 所以你写C#通过COM调用方法,然后从powershell调用?
      • @grom:这就是我试图做的,还没有完全解决,因为即使在 COM 中它也需要 InvokeMember
      【解决方案6】:

      感谢以上指点。即使在 C# 中使用 .NET 4 的新动态特性,我也能够解决这个问题。我所做的只是:

      var word = new Microsoft.Office.Interop.Word.Application();
      word.WordBasic.DisableAutoMacros();
      

      显然,由于 WordBasic 是动态,因此没有智能感知支持为 DisableAutoMacros() 提供提示。但这对我有用;由于某些宏中的某些错误而弹出的所有错误消息都消失了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-19
        • 1970-01-01
        • 1970-01-01
        • 2016-05-15
        相关资源
        最近更新 更多