【问题标题】:How to pass a COM object parameter to a PowerShell function? [duplicate]如何将 COM 对象参数传递给 PowerShell 函数? [复制]
【发布时间】:2020-07-18 21:25:31
【问题描述】:

我有一个 PowerShell 脚本来打开几个 Excel 电子表格并写入每个电子表格中的一个单元格。我想把代码打开每个电子表格,写入它,并将其保存在一个函数中。我不想为每个电子表格创建一个 Excel.Application COM 对象的新实例,而是将一个实例传递给函数,以便可以重用该实例。

这是我的功能:

function InsertBlurb
{
    param([Object[]]$xl, [string]$filename, [string]$blurb)
    $WorkBook = $xl.Workbooks.Open($filename)
    $WorkSheet = $WorkBook.Sheets.Item("Print Out")
    $WorkSheet.Cells.Item(12, "A") = $blurb
    $WorkBook.Save()
    $WorkBook.Close()
}

# Call looks like this
InsertBlurb($objExcel, $dsBook, $blurb)

当我尝试运行该函数时,出现错误:

You cannot call a method on a null-valued expression.
At T:\rclocher3\Excel-to-PDF2.ps1:32 char:35
+     $WorkBook = $xl.Workbooks.Open <<<< ($filename)
    + CategoryInfo          : InvalidOperation: (Open:String) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

如何将 COM 对象 Excel.Application 的实例传递给 PowerShell 函数?

【问题讨论】:

    标签: function powershell parameters com


    【解决方案1】:

    首先,你的电话应该是:

    InsertBlurb $objExcel $dsBook $blurb
    

    调用 Powershell 函数时不带括号和逗号。

    IDK 如果您在函数中定义了 $xl,请写入。也许,也许不是……倾向于后者,但不确定。如果类型错误,您可以省略类型。很难想象它是一个对象数组。

    【讨论】:

    • 位置参数不会起作用,除非在使用参数时添加[Parameter(Position=Number)]。
    • 根据微软的说法,“y 默认,所有函数参数都是位置的。PowerShell按照参数在函数中声明的顺序为参数分配位置编号。要禁用此功能,请将值设置为将 CmdletBinding 属性的 PositionalBinding 参数设置为 $False" 这来自 docs.microsoft.com/en-us/powershell/module/…
    • 需要在你的函数中加入一些调试语句,打印出函数接收到的参数。然后在调用 Open 之后,检查 $Workbook 的值。然后在下一次调用后检查 $Worksheet 的值。就个人而言,我首先会在 Excel VBA 环境中编写一个等效函数,并确保该环境中的所有调用都有效。也许您在其中一个调用中缺少参数。 IDK...
    • 你的权利,我相信以前的 powershell 版本不是这种情况。谢谢指正。
    • AFAIK...AFAIK...我的经验是至少从第 2 版开始就是这种情况。我认为...以前从未遇到过问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-30
    • 2016-06-26
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多