我无法使用Powershell将Word 2010(14.0.x)文档提供给SaveAs或Close。从网上的所有内容来看,似乎应该使用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,但它只是一直跟着我。
我所能找到的只是显然linked to PS 3.0 Beta(似乎在2.0中对人有效)和评论Ed Wilson hasn't gotten back to。
答案 0 :(得分:2)
我也因此错误而苦苦挣扎,但最后通过调用PSReference的“Value”属性来解决它(我在这里得到了我的信息:https://msdn.microsoft.com/en-us/library/system.management.automation.psreference(v=vs.85).aspx)
这最终导致了codeLines:
$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 :(得分:1)
您只需在致电[ref]
时使用SaveAs
即可。这对我有用:
$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()
答案 2 :(得分:0)
这可能会对您有所帮助:
Office Interop API扩展程序
Office Interop API Extensions工具使用了中的新功能 Microsoft .NET Framework 3.5和Microsoft Visual C#3.0包装 Office对象模型并为其提供更高效的环境 C#开发人员。具体来说,它采用扩展方法,对象 初始化器和可空类型来创建简化的, 强类型,在某些情况下,类似于Microsoft Visual Basic的API。 它不是Office的完整托管API,但旨在实现 以有用的方式扩充原始对象模型。
Office对象模型最初针对动态语言 例如Microsoft Visual Basic for Applications(VBA)和Visual 基本。因此,它广泛使用了他们的一些功能, 例如后期绑定和可选参数。作为一个早期的和 强类型语言,C#可能很笨拙,乏味且容易出错 在这种情况下使用。 Office Interop API扩展,带有它 简化和强类型API,使C#开发人员成为 在此上下文中作为Visual Basic开发人员生产。
我知道PowerShell 3.0是基于CLR4的,但是这个程序集应该仍然可以正常加载。它消除了对所有[ref]参数的需要。由于很多此API都基于扩展方法(在PowerShell中不存在),因此您必须将$word
或$doc
实例作为许多方法的第一个参数传递