Com 查找MS Office互操作常量的值,而不是对其进行硬编码

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 并确

使用PowerShell,创建(例如)Excel应用程序类的实例并开始对其进行操作非常简单:

$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
    # ...
    

或:[Microsoft.Office.Interop.Excel.Constants]::xlDoubleQuote.Value\uu这是最好的,但似乎对Visio的处理方式不同。下面的另一个回答中描述了一个勉强可以接受的解决方法(填充哈希大约需要12秒)。