Кажется, что при вызове блока сценария Powershell (путем вызова метода .Invoke()
) всегда создается коллекция. В частности, коллекция типа
System.Collections.ObjectModel.Collection`1[[System.Management.Automation.PSObject, System.Management.Automation, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]
Даже при вызове пустого блока скрипта ({}.Invoke()
) возвращается коллекция. Вызов одного и того же блока сценария с использованием оператора вызова (&
) дает обычно ожидаемый результат (либо скаляр, либо [object[]]
).
Это оказывается удобным, если вам нужен набор вместо массива, но это кажется противоречивым.
Кто-нибудь знает, почему он так себя ведет?
Edit:
Я знал, что есть два разных вызова, .Invoke()
и .InvokeReturnAsIs()
от чтения спецификации языка. Вот где я впервые это заметил.
Я просто не понимаю причины, стоящие за соглашением об именах, и то, как его механизм работает. Глядя на документацию, я бы подумал, что метод вызова по умолчанию - это не то, что используется, когда скрипт-блок вызывается в Powershell. Похоже, что .InvokeReturnAsIs()
просто возвращает поток объектов, а затем Powershell упаковывает его в массив объектов, если имеется более одного объекта, как скалярный, если есть только один объект, или создает нулевой объект, если его нет, как будто неявный конвейер там. Использование .Invoke()
всегда возвращает коллекцию, а Powershell оставляет ее как коллекцию.