Почему вызов блока сценария Powershell с помощью .Invoke () возвращает коллекцию?

Похоже, что вызов блока сценария Powershell (путем вызова метода .Invoke () ) всегда производит коллекция. В частности, коллекция типа

System.Collections.ObjectModel.Collection`1 [[System.Management.Automation.PSObject, System.Management.Automation, Version = 3.0.0.0, Culture = нейтральный, PublicKeyToken = 31bf3856ad364e35]]

Даже вызов пустого блока скрипта ( {}. Invoke () ) возвращает коллекцию.Вызов того же блока сценария с использованием оператора вызова ( & ) дает обычно ожидаемый результат (либо скаляр, либо [объект []] ).

Это удобно, если вам нужна коллекция, а не массив, но это кажется нелогичным.

Кто-нибудь знает, почему он так себя ведет?

Редактировать:

Я знал, что есть два разных вызова, .Invoke () и .InvokeReturnAsIs () из прочтения спецификации языка. Там я впервые это заметил.

Я просто не понимаю причин, лежащих в основе соглашения об именах, и того, как, по-видимому, работает его механика. Глядя на документацию, я бы подумал, что метод вызова по умолчанию - это не то, что используется, когда блок сценария вызывается в Powershell. Похоже, что .InvokeReturnAsIs () просто возвращает поток объектов, а затем Powershell превращает его в массив объектов, если существует более одного объекта, как скаляр, если есть только один объект, или создает нулевой объект, если их нет, как будто там есть неявный конвейер. Использование .Invoke () всегда возвращает коллекцию, а Powershell оставляет ее как коллекцию.

6
задан mklement0 21 June 2017 в 22:01
поделиться