продвигая экспансию через конвейер PowerShell - PullRequest
1 голос
/ 24 мая 2011

Кто-нибудь обнаружил, чтобы это произошло.Я хочу иметь командлет, который создает вывод из базы данных.Конкретной схемы нет, каждая «строка» может иметь разные поля.В чем-то вроде javascript это не будет проблемой, каждый объект будет иметь все необходимые свойства;но powershell не такой.

Я попробовал наивную реализацию, но все, что я получил, это перечисление словаря Key, Value, которое расширяется, притворяясь.

Расширяя вопрос.1006 * Какой объект должен выполнить командлет get-datarows по каналу (он принимает произвольные запросы).Я не знаю, какие типы объектов нужно создавать и выдвигать.Запрос базы данных может вернуть строку с User = dave, Age = 12, затем другую строку с User = pete, Favcol = red.В следующий раз при запуске командлета запрос может вернуть что-то совершенно другое (Type = shoe, color = red, use = dance).Возможность создания конвейера экспансии здесь прекрасно работает (за исключением того, что это не так)

Мой лучший путь - создать тип на лету с помощью mirror.emit, но для этого необходимо, чтобы я знал схемуобъектов.Я мог бы сделать это, посмотрев на первый объект, возвращенный запросом db, но у него могут быть не все возможные атрибуты (как в первых двух пользовательских строках выше).Я мог читать до самого конца;сделать тип, перемотать и нажать экземпляры динамически созданного типа, но это не очень эффективно

EDIT2: еще больше разъяснений

Я кодирую в C #

Я хочучтобы иметь возможность

mycmdlet -query "users" | ft

или

mycmdlet -query "products;type=shoe,size>1" | make-pretty

Я не хочу, чтобы пользователю приходилось выполнять целую кучу операций по формированию данных;в этом вся цель командлета

Ответы [ 3 ]

1 голос
/ 25 мая 2011

Я понял это. PowerShell имеет свои собственные экспансии; PSObject. Это то, что на самом деле выдвигается WriteObject. Но вы можете сделать свой собственный

Так же

var obj = new PSObject();
obj.properties.add(new PSNoteProperty("foo", 42));
obj.properties.add(new PSNoteProperty("bar", "xxxx"));
WriteObject(obj);
0 голосов
/ 24 мая 2011

Я либо неправильно понимаю ваш вопрос, либо делаю это все время. Мой код все на работе, но в psuedo-

$results = Get-ResultSet...
$columns = @{}
foreach ($column in $results.Columns)
{
    columns.Add($column.Name,$column.Index)
}
foreach ($row in results)
{
    $return = New-Object PSObject
    foreach ($key in $columns.keys)
    {
        $return | Add-Member -MemberType NoteProperty -name $key $row[$columns[$key]]
    }
    $return
}

Ваш пользовательский объект будет иметь столько же свойств, сколько столбцов, и каждое свойство будет иметь желаемое значение.

0 голосов
/ 24 мая 2011

Нет никаких причин, по которым вы не можете иметь объекты с разными наборами свойств в конвейере. Это должно работать нормально. Я делаю это все время.

Не могли бы вы рассказать о том, что не работает? Возможно, пример того, что вы пытаетесь сделать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...