2016-02-02 3 views
2

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-CurrentDocument функции:

ссылка на объект не указывает на экземпляр объекта ,

Почему это происходит? Этот способ отлично подходит для моих функций Get-CurrentEditor и Get-CurrentDatabase.

ответ

2

Возможной причиной такой разницы является поведение PowerShell для разворачивания коллекций. Если $cad::DocumentManager является коллекцией, то Get-DocumentManager вернет не сама коллекция, а элементы коллекции. Чтобы этого избежать, вам нужно использовать унарный оператор массива ,. Он создает массив с одним элементом. И этот массив будет развернут вместо коллекции.

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