Com 查找MS Office互操作常量的值,而不是对其进行硬编码
使用PowerShell,创建(例如)Excel应用程序类的实例并开始对其进行操作非常简单:Com 查找MS Office互操作常量的值,而不是对其进行硬编码,com,powershell,ms-office,office-interop,Com,Powershell,Ms Office,Office Interop,使用PowerShell,创建(例如)Excel应用程序类的实例并开始对其进行操作非常简单: $app = New-Object -ComObject "Excel.Application" 然而,如果我需要使用诸如xlDoubleQuote或xlDelimited之类的常量,我似乎被迫对它们进行硬编码。我真的希望能够做到以下几点: $constants = New-Object -ComObject "Excel.Constants" $constants.xlDoubleQuote 并确
$app = New-Object -ComObject "Excel.Application"
然而,如果我需要使用诸如xlDoubleQuote或xlDelimited之类的常量,我似乎被迫对它们进行硬编码。我真的希望能够做到以下几点:
$constants = New-Object -ComObject "Excel.Constants"
$constants.xlDoubleQuote
并确保它将返回值1。不幸的是,我无法创建枚举实例,而且似乎没有一种方法可以像普通的.NET类库那样引用它:
[Excel.Constants]::xlDoubleQuote
是否有某种方法可以将该枚举动态导入PowerShell?可能通过托管库而不是COM?使用Excel的主互操作程序集。如果您已经安装了Office,这些应该在GAC中。像这样使用:
Add-Type -AssemblyName Microsoft.Office.Interop.Excel
[int][Microsoft.Office.Interop.Excel.Constants]::xlDoubleQuote
基思已经给了你答案,这是另一个选择。您可以在$xlConstants对象上使用tab completion来获取常量:
$xl = New-Object -ComObject Excel.Application
$constants = $xl.gettype().assembly.getexportedtypes() | where-object {$_.IsEnum -and $_.name -eq 'constants'}
$pso = new-object psobject
[enum]::getNames($constants) | foreach { $pso | Add-Member -MemberType NoteProperty $_ ($constants::$_) }
$xlConstants = $pso
Keith和Shay给出了完美的答案,但请注意: 使用Excel 2003或Excel 2007时,应在计算机上安装Office主互操作程序集(PIA)。Microsoft提供了可再发行的版本。有关更多信息,请参阅stackoverflow.com的帖子:
使用Visio 2016 32位时,我发现尝试使用Keith Hill的方法会导致错误消息:“添加类型:无法添加类型。找不到程序集“Microsoft.Office.Interop.Visio”。Shay Levy的方法需要进一步修改才能使用Visio。以下是我能够得到的工作:
$visioApp = New-Object -ComObject Visio.Application
$visioConstants = @{}
$visioEnums = $visioApp.gettype().assembly.getexportedtypes() | where-object {$_.IsEnum } #-and $_.name -eq 'constants'}
The answers of Keith Hill and Shay Levy are best, however, I found that Visio
$visioEnums |%{
$enumname = $_
[enum]::getNames($enumname) | foreach {
$val = invoke-expression "[$($enumname)]::$($_).value__"
$visConstants.$_ = $val
}
}
$visioApp.Quit()
echo $visConstants.visTopEdge
令人失望的是,当我进行测试时,执行大约需要12秒。将来自的技术与来自的制表符完成思想结合起来: 注意:要查找
常量
类型的全名,您可以使用制表符完成:在运行新对象-ComObject Excel.Application
后,键入[常量
(不要键入关闭的]
),它应该扩展到[Microsoft.Office.Interop.Excel.Constants
;如果显示的是来自Microsoft.Office.Interop.Excel以外的命名空间的类型,请按tab键,直到找到所需的类型
现在您可以:
- 通过
运算符访问单个枚举值作为存储在:
中的静态类型成员,该运算符也可用于制表符完成;例如:$xlConstants
$xlConstants::xl3d<tab> # -> expands to $xlConstants::xl3DBar
- 枚举所有符号名:
[enum]::GetNames($xlConstants)
PS> [enum]::GetNames($xlConstants) | Select @{ n='Name'; e={$_} }, @{ n='Number'; e={ $xlConstants::$_.Value__ } } Name Number ---- ------ xlAbove 0 xlFirst 0 xlDirect 1 # ...
- 还显示符号名称下面的数字:
[enum]::GetNames($xlConstants)
PS> [enum]::GetNames($xlConstants) | Select @{ n='Name'; e={$_} }, @{ n='Number'; e={ $xlConstants::$_.Value__ } } Name Number ---- ------ xlAbove 0 xlFirst 0 xlDirect 1 # ...