PowerShell中的Word.Application ComObject错误

5
我无法使用Powershell将Word 2010 (14.0.x)文档另存为关闭。在线教程中都显示应该可以在2.0版本上运行,但我没有这个版本了。
简单情况:
$Path = "C:\MyDoc.docx"
$Word = New-Object -comobject Word.Application
$Word.Visible = $True #Do this to close it out without task manager
$Doc = $Word.Documents.Open($Path)
$Doc.SaveAs($Path)
$Doc.Close()

到目前为止,一切都正常,直到保存并关闭:

Argument: '1' should be a System.Management.Automation.PSReference. Use [ref].
At line:5 char:1
+ $Doc.SaveAs($Path)
+ ~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodException
    + FullyQualifiedErrorId : NonRefArgumentToRefParameterMsg

Argument types do not match
At line:6 char:1
+ $Doc.Close()
+ ~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (:) [], ArgumentException
    + FullyQualifiedErrorId : Argument types do not match

似乎Get-Member显示具有参数的任何方法都会失败。例如,调用简单的$Doc.Save()可以正常工作。查看MSDN关于这些方法的信息,它似乎需要像SaveChanges方法那样的东西,但这实在超出了我的能力范围。
我已经尝试过传递$Null或$True或$False,希望能运气好一点,但它仍然不停地反对我。
我能找到的所有信息都是它显然与PS 3.0 Beta相关(对于人们来说,在2.0中似乎运行良好),以及一条评论Ed Wilson没有回复
3个回答

3
我也曾经为这个错误苦恼,但最终通过调用PSReference的“Value”属性来解决了它(我在这里获取了信息:https://msdn.microsoft.com/en-us/library/system.management.automation.psreference(v=vs.85).aspx)。
这最终导致了以下代码行:
$filename = [ref]"C:\Temp\pv_report.docx"    
[ref]$option = [Microsoft.Office.Interop.Word.WdSaveFormat] -as [type]
$document.SaveAs(([ref]$filename).Value, ([ref]$option::wdFormatDocumentDefault).Value)
$document.Close()

1

当您调用SaveAs时,只需使用[ref]即可。这对我很有效:

$Path = "C:\MyDoc.docx"
$NewPath = "C:\MyDocRenamed.docx"
$Word = New-Object -comobject Word.Application
$Word.Visible = $True #Do this to close it out without task manager
$Doc = $Word.Documents.Open($Path)
$Doc.SaveAs([ref] $NewPath)
$Doc.Close()

1
还是不行,仍然出现“参数类型不匹配”的错误。我之前尝试过调整[ref],但没有用。我不确定应该引用什么。也许这不仅仅是PS版本的问题?如果有帮助的话,我使用的是Windows 7 64位、Powershell 3 beta和Office 14.0.6123.5001 64位。 - squid808
我之前也遇到过同样的问题,这个解决方案对我起了作用。使用的操作系统是Windows 7 64位版本,Powershell 2。 - hshib

0

这可能会对你有所帮助:

http://msdn.microsoft.com/en-us/library/office/cc626294(v=office.12).aspx#VSTO3PowerTools_OfficeInteropAPIExtensions

Office Interop API扩展 Office Interop API扩展工具使用Microsoft .NET Framework 3.5和Microsoft Visual C# 3.0中的新功能来包装Office对象模型,并为C#开发人员提供更高效的环境。具体而言,它采用扩展方法、对象初始化器和可空类型来创建一个简化的、强类型的API,在某些情况下类似于Microsoft Visual Basic的API。它不是Office的完整托管API,而是旨在以有用的方式增强原始对象模型。
Office对象模型最初针对动态语言(如Microsoft Visual Basic for Applications(VBA)和Visual Basic)进行了定位。因此,它广泛使用了一些它们的功能,例如后期绑定和可选参数。作为一种早期绑定和强类型语言,当在这种上下文中使用时,C#可能会很笨拙、繁琐和容易出错。通过其简化和强类型的API,Office Interop API扩展使C#开发人员能够在这种上下文中像Visual Basic开发人员一样高效。

我知道PowerShell 3.0是基于CLR4的,但这个程序集仍然应该可以正常加载。它消除了所有[ref]参数的需要。由于很多API都是基于扩展方法(这在PowerShell中不存在),所以你需要将$word$doc实例作为大部分方法的第一个参数传递。


1
尝试从网站下载VSTO_PTExtLibs.exe,以获取Interop工具,但在我尝试安装时,由于我没有安装Visual Studio 2008,安装程序失败了。我已经安装了VS 2010,所以我不认为我会安装2008来尝试这个。此外,我希望得到的东西可以在任何安装了Office的PC上运行,这将增加另一个必需组件。在此期间,我将继续寻找,谢谢! - squid808

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接