gpt4 book ai didi

excel - Powershell 函数如何指定 ComObject 参数类型?

转载 作者:行者123 更新时间:2023-12-04 21:26:44 25 4
gpt4 key购买 nike

假设我正在尝试编写一个将结果集打印到 Excel 工作表的 Powershell 函数,如下所示:

function Write-ToWorksheet {
param (
[Parameter( Position = 0, Mandatory = $true )]
[MyLibrary.MyCustomResultType[]]
$ResultSet,

[Parameter( Position = 1, Mandatory = $true )]
[Excel.Worksheet]
$Worksheet
)
# ... Implementation goes here ...
}
假设我以这样的方式称呼它:
$excel = New-Object -ComObject Excel.Application
$wb = $excel.Workbooks.Add()

$results = Get-MyResults # Never mind what this does.

Write-ToWorksheet -ResultSet $results -Worksheet $wb.Sheets[ 1 ]
这段代码几乎可以工作,除了它阻塞了我的类型规范 [Excel.Worksheet] .
我意识到没有必要指定参数类型,没有它,代码也可以正常工作,如 this answer指出。
但是为了取悦我内心的学究,有没有办法使用对 COM 对象类型(如 Excel.Worksheet)的引用来限制参数类型? ?

最佳答案

PowerShell 提示您的 Excel.Worksheet 的原因type 是因为它不是真正的 .NET 类/接口(interface)的名称。
您需要指定的参数类型是 Microsoft.Office.Interop.Excel.Worksheet而是(一旦加载了 Excel 互操作程序集,直接通过 Add-Type 或在调用 New-Object -ComObject Excel.Application 之后,因为这也会加载所需的库)
话虽如此,我不相信这会按预期工作,因为 PowerShell 通过在 PowerShell 中公开的变量的真实类型之间创建透明的 COM 适配器层来处理 COM 对象的方式。
有趣的是,PowerShell 在通过命名参数与位置参数提供参数转换时处理参数转换的方式似乎有所不同,如下面的演示代码所示:

function Get-WorksheetName {
param (
[Parameter( Position = 1, Mandatory = $true )]
[Microsoft.Office.Interop.Excel.Worksheet]
$Worksheet
)

return $Worksheet.Name
}
使用命名参数调用函数失败:
Named arguments
而通过位置参数调用函数按预期工作:
Positional arguments
如果您不想使用位置参数,那么另一种选择是删除参数类型约束,而是使用 ValidateScript 检查类型。而是属性。这仍然确保类型安全:
function Get-WorksheetName {
param (
[Parameter(Position = 1, Mandatory = $true)]
[ValidateScript({$_ -is [Microsoft.Office.Interop.Excel.Worksheet]})]
$Worksheet
)

return $Worksheet.Name
}
传递不同类型的对象将导致:
Type safety via ValidateScript

关于excel - Powershell 函数如何指定 ComObject 参数类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72668602/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com