2015-05-07 2 views
1

Я часто получаю данные из базы данных и настраиваю коллекцию типов объектов datarow, чтобы отразить «тип» данных, которые представляет строка. Например, если я смотрю на datarows, которые представляют компьютерные объекты, я могу добавить «MDS__COMPUTER» в конец коллекции TypeNames. Я делаю то же самое с PSObjects, которые я создаю с помощью New-Object.Работа с настраиваемыми записями и параметрами PowerShell TypeNames

Я использовал это в прошлом с системой расширенного типа PowerShell (ETS), чтобы помочь с форматированием и добавлением элементов на уровне типа, а не с помощью add-member, но мне бы очень хотелось иметь возможность ограничивать параметры функций и скриптов, указав эти «мета-типы» как тип параметра.

В примере, который я дал выше, я хотел бы быть в состоянии сделать это:

Param([MDS__COMPUTER]$comp) 

и иметь чек PowerShell, чтобы увидеть, если $ Comp переданный объект имел, что в его коллекции TypeNames.

Возможно ли это как-то? Я бы хотел избежать создания реальных классов C# и копирования данных из объектов datarow (или PSObjects) в новые объекты.

Следует упомянуть, что использование типа, который не существует в качестве реального типа, вызывает ошибку.

+0

Вы пытались использовать 'ValidateScript' в качестве свойства параметра? – TheMadTechnician

ответ

1

От here следующее решение, кажется, работает (не уверен, какая версия PowerShell требуется). Добавление свойства PSTypeName к PSCustomObject заставляет его быть признаны в качестве такого типа:

$widget = [pscustomobject]@{ 
    PSTypeName = 'Widget' 
    Color = $null 
    Size = $null 
} 

function Get-Something 
{ 
    [CmdletBinding()] 
     param 
     (
      [Parameter()] 
      [ValidateNotNullOrEmpty()] 
      [PSTypeName('Widget')]$Widget 
     ) 

     $Widget 
} 

Престижность Kirk Манро и Адама Бертрама

Оказывается, это работает отлично, если вы меняете TypeNames() массив на существующий объект (который я искал):

$x=get-service BITS 
$x.PSObject.TypeNames.Insert(0,'Widget') 

Get-Something $x 
2

Вы можете использовать ValidateScript в объявлении параметра, чтобы проверить, имеет ли коллекция TypeNames имя TypeName, которое мы ищем. Это, как я хотел бы сделать это:

function MyFunction 
{ 
    Param 
    (
     # Parameter that accepts custom TypeName 
     [Parameter(Mandatory=$false, 
        Position=0)] 
     [ValidateScript({$_.PSObject.TypeNames -contains 'MyType'})] 
     [ValidateNotNullOrEmpty()] 
     $Comp 
    ) 

    # YOUR CODE HERE 
    return $comp 

} 
+0

ОК ... это должно было быть очевидно, но мне это никогда не приходило в голову. –

+0

Я думаю, что он может даже просто сделать '{$ _ -is [MDS__COMPUTER]}' для своего скрипта проверки. – TheMadTechnician

Смежные вопросы