代码之家  ›  专栏  ›  技术社区  ›  Andrey Bushman

这些函数定义不相同吗?

  •  2
  • Andrey Bushman  · 技术社区  · 8 年前

    PowerShell 4.0

    它工作得很好:

    $cad  = [Autodesk.AutoCAD.ApplicationServices.Application]
    function Get-DocumentManager { $cad::DocumentManager }
    function Get-CurrentDocument { $cad::DocumentManager.MdiActiveDocument }
    function Get-CurrentEditor { (Get-CurrentDocument).Editor }
    function Get-CurrentDatabase { (Get-CurrentDocument).Database }
    

    所有这些函数都返回必要的对象。但如果我重写 Get-CurrentDocument 函数,然后我得到问题:

    $cad  = [Autodesk.AutoCAD.ApplicationServices.Application]
    function Get-DocumentManager { $cad::DocumentManager }
    function Get-CurrentDocument { (Get-DocumentManager).MdiActiveDocument }
    function Get-CurrentEditor { (Get-CurrentDocument).Editor }
    function Get-CurrentDatabase { (Get-CurrentDocument).Database }
    

    当我启动 获取当前文档 功能:

    对象引用未设置为对象的实例。

    为什么会发生这种情况?这种方式很适合我 Get-CurrentEditor Get-CurrentDatabase 功能。

    1 回复  |  直到 8 年前
        1
  •  2
  •   user4003407    8 年前

    这种差异的可能原因是PowerShell展开集合的行为。如果 $cad::DocumentManager 是集合,那么 Get-DocumentManager 将返回的不是集合本身,而是集合的元素。为了防止这种情况,您需要使用一元数组运算符 , 。它创建具有单个元素的数组。该数组将展开而不是集合。

    function Get-DocumentManager { ,$cad::DocumentManager }