Проблема PowerShell с использованием Select-Object с командлетом C #

Я написал простой командлет C #, назовем его Get-Data, который возвращает массив объектов.

protected override void ProcessRecord() {
    base.ProcessRecord();

    DummyClass[] refs = new DummyClass[2];
    refs[0] = new DummyClass("A", "big");
    refs[1] = new DummyClass("B", "small");

    base.WriteObject(refs);
    return;
}

Это определение DummyClass:

public class DummyClass {
    public string Name { get; set; }
    public string Type { get; set; }
    public DummyClass(string name, string  type) {
        this.Name = name;
        this.Type = type;
    }
}

Когда я запускаю командлет отдельно, я получаю ожидаемый результат - одну строку с заголовками столбцов и дополнительную строку для каждого элемента массива.

PS> Get-Data

Name Type
---- ----
A    big
B    small

Однако, когда я передаю вывод в Select-Object, я вижу заголовки столбцов, но не строки данных.

PS> Get-Data | Select-Object -Property Name,Type

Name Type
---- ----

Я даже попытался указать количество строк, но безуспешно:

PS> Get-Data | Select-Object -Property Name,Type -Last 2

Проверка типа Get-Data возвращает тип данных DummyClass[], чего я и ожидал.

(Get-Data).GetType().FullName

Есть ли у кого-нибудь мысли о том, почему при использовании Select-Object нет строк данных? Не знаю, имеет ли это значение, но этот командлет наследуется от System.Management.Automation.PSCmdlet.


person scantrell    schedule 18.11.2019    source источник
comment
вы что-нибудь видите, если запустите Get-Data | Select-Object -Property *?   -  person Lee_Dailey    schedule 18.11.2019
comment
Вот что я вижу: Количество: 2 ‹br/› Длина: 2 LongLength: 2 Ранг: 1 SyncRoot: {A, B} IsReadOnly: False IsFixedSize: True IsSynchronized: False   -  person scantrell    schedule 18.11.2019
comment
Извините за небрежность моего предыдущего комментария, я все еще пытаюсь понять форматирование комментариев - пожалуйста, не обращайте внимания на ‹br/›, и каждое из свойств (Count, Length и т. Д.) Находится на новой строке в PS.   -  person scantrell    schedule 18.11.2019
comment
комментарии имеют очень слабое форматирование. все, что даже слегка сложное, лучше всего добавлять в исходный пост. ///// поскольку в вашем списке свойств не отображаются Name или Type ... это означает, что в вашем объекте есть что-то странное. Я рекомендую вам сохранить объект в $ Var, а затем посмотреть, что $Var.GetType() покажет вам.   -  person Lee_Dailey    schedule 18.11.2019


Ответы (1)


Причина, по которой это не работает, заключается в том, что DummyClass[] не имеет свойства Name или Type, поскольку это массив. Вы можете заставить его распутаться, вложив конвейеры:

(Get-Data) |Select-Object Name,Type

Измените эту строку:

base.WriteObject(refs);

to

base.WriteObject(refs, true);

чтобы исправить поведение по умолчанию.

Второй аргумент (enumerateCollection) заставляет среду выполнения команды распутывать ваш массив перед отправкой его по потоку следующему командлету в конвейере.

person Mathias R. Jessen    schedule 18.11.2019