如何使用PowerShell对MS Word文档执行自动测试?

如何使用PowerShell对MS Word文档执行自动测试?,powershell,ms-word,Powershell,Ms Word,我们经常需要对一堆MS Word文档执行一些相对简单的测试。由于这些检查目前都是手工完成的,我正在努力寻找一种方法来实现自动化。例如: 检查是否每一页都有页码,并确认其正确无误 验证页面标题中的版本标识符在所有页面中是否相同 检查文档是否有目录 检查文档是否有图表 检查是否每个图形都有标题 等等。将PowerShell与Word API结合使用是否合理可行?PowerShell可以通过其对象模型/Interop(在Windows上,无论如何)访问Word,并且AIUI也可以与Office O

我们经常需要对一堆MS Word文档执行一些相对简单的测试。由于这些检查目前都是手工完成的,我正在努力寻找一种方法来实现自动化。例如:

  • 检查是否每一页都有页码,并确认其正确无误
  • 验证页面标题中的版本标识符在所有页面中是否相同
  • 检查文档是否有目录
  • 检查文档是否有图表
  • 检查是否每个图形都有标题

等等。将PowerShell与Word API结合使用是否合理可行?

PowerShell可以通过其对象模型/Interop(在Windows上,无论如何)访问Word,并且AIUI也可以与Office Open XML OOXML)API配合使用,因此您应该能够对文档内容编写任何检查。不太明显的是如何验证文档内容是否会产生特定的“打印外观”。首先,我将对细节进行一些评论

请记住,在下面的注释中,我只是指出了一些您可能需要处理的事情。如果你正在检查一个组织制作的文档,而该组织的员工大体上已经遵循相同的标准,那么这可能会更容易

在你给出的5个例子中,如果不检查细节,我无法确切地说出你将如何做,而且所有这些都可能有困难,但是举个例子

使用OOXML或对象模型都很困难,因为您真正要检查的是特定节的头是否有可见的{PAGE}字段代码。因为该字段代码可能嵌套在其他字段中,这些字段表示“如果不显示此字段代码”,所以要确定是否有页码并不容易

这就是我所说的检查文档“打印外观”的意思——例如,如果您可以使用对象模型打印为PDF,并且有某种机制让PS检查PDF的内容,那么这可能是一种更好的方法

Verify that a version identifier in the page header is identical across all pages.
与上述问题类似,IMO。这部分取决于如何插入版本标识符。这只是一段文字吗?它可以从多个字段构建吗?它可能引用文档属性或变量,或者自定义XML内容

Check if the document has a table of contents.
可能足以查找没有特定选项的TOC字段,例如图表将包含的\c选项

 Check if the document has a table of figures.
可能足以检查具有\c选项的TOC字段,可能带有特定参数,如“Figure”

不确定你是否能分辨出一个特定的图像是否是一个“人物”。但是如果您的意思是“验证每个图形对象都有一个标题”,那么您可能会遍历文档中的内联和浮动图形,并验证在该对象的特定距离内是否有类似于单词标准标题段落的内容。Word有两种用于AFAIK标题的标准字段代码模式(一种包含章节号,另一种不包含章节号),因此您可以查找它们。您可以通过确保图像与标题之间的距离不超过预定义的段落数来测量图像与标题之间的距离,或者在浮动图像的情况下,可能是固定图像的段落与标题之间的距离不超过如此多的段落

您可能需要处理的几个更一般的问题: -仅仅因为文档包含某个特性,例如ToC字段,并不意味着它是可见的。TOC字段可能已格式化为不可见。更难检测的是,它可能被格式化为白色。 -更改跟踪。在检查是否存在任何给定功能之前,您可能必须使用Word对象模型“接受更改”。除非您可以找到现有的代码来帮助您使用文档的OOXML表示来实现这一点,否则这可能是通过对象模型进行检查的一个很好的例子

最后的一些意见

  • 对于将来的检查,也许值得注意的是,原则上您可以创建一个“DocumentInspector”,用户可以从Word BackStage调用它来对文档执行检查。不确定您是否可以强制用户运行它,或者您是否可以在PS中创建它,但这可能是一个有用的工具

  • 从长远来看,如果您正在进行大量的检查,也许值得考虑是否可以训练一个ML模型来尝试检测问题


是否允许您的PS代码通过自动化/互操作访问Word对象模型,或者您是否试图避免这种情况,例如,这样您就可以运行服务器端?只是在我看来,但你可以让这件事像你喜欢的那样简单,也可以像你喜欢的那样难。-e、 g.“离图有多近。标题必须是,你是否通过查找一个标准单词标题字段编号序列来确定它是标题,或者什么?是的,它可以访问对象模型,客户端运行就足够了。我想保持简单,如果需要,我可以为此制定“业务规则”(例如,所有标题必须使用这个或那个单词机制创建)。
 Check if the document has a table of figures.
 Check if every figure has a caption.