5

我无法使用 Powershell将 Word 2010 (14.0.x) 文档另存为或关闭。从网上的所有 tuts 来看,它似乎应该与 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 还没有回复到.

4

3 回答 3

3

我也为这个错误苦苦挣扎,但最终通过调用 PSReference 的“值”属性解决了这个问题(我在这里得到了我的信息: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()
于 2016-08-12T10:47:39.653 回答
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()
于 2012-08-30T15:23:04.527 回答
0

这可能会帮助您:

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

Office 互操作 API 扩展

Office 互操作 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# 可能会很笨拙、乏味且容易出错。Office 互操作 API 扩展及其简化的强类型 API 使 C# 开发人员在此上下文中的工作效率与 Visual Basic 开发人员一样。

我知道 PowerShell 3.0 基于 CLR4,但是这个程序集应该仍然可以加载。它消除了对所有 [ref] 参数的需要。由于许多此 API 都基于扩展方法(powershell 中不存在的东西),因此您必须将$wordor$doc实例作为许多方法的第一个参数传递。

于 2012-09-13T12:09:00.850 回答