2010-09-03 18 views
7

Yeni Nesne ile özel bir PowerShell türü tanımlıyorum. Tanımlanmış türümden bir parametrenin olmasını isterim, bu türü bildirici bir şekilde belirtmek mümkün mü? Aşağıdaki kod bana şu hatayı veriyor: "[BuildActionContext] türünü bulamıyor: bu tür bir derlemenin yüklü olduğundan emin olun."Parametre türü belirtimi için özel PowerShell tanımlı türünü kullanın

Bildiri türünü belirtebilir miyiz, yoksa belirtilen nesnenin türünü sınamalı mıyım?

Değil çalışma kodu:

$buildActionContext = New-Object -TypeName PSObject -Property @{ 
# Given properties 
BuildAction = "Build"; 
} 
$buildActionContext.PSObject.TypeNames.Insert(0, 'BuildActionContext') 

function DoSomethingWithBuildActionContext 
{ 
[CmdletBinding()] 
param 
(
    [Parameter(Mandatory=$true)][BuildActionContext]$Context 
) 

Write-Host "Build action: $($Context.BuildAction)" 
} 

DoSomethingWithBuildActionContext -Context $buildActionContext 

Çalışma kod, ancak farklı şekilde yapılabilir:

$buildActionContext = New-Object -TypeName PSObject -Property @{ 
     # Given properties 
     BuildAction = "Build"; 
    } 
    $buildActionContext.PSObject.TypeNames.Insert(0, 'BuildActionContext') 

function DoSomethingWithBuildActionContext 
{ 
    [CmdletBinding()] 
    param 
    (
     [Parameter(Mandatory=$true)]$Context 
    ) 

    if ($Context.PSObject.TypeNames[0] -ne 'BuildActionContext') 
    { 
     throw "Context parameter not of type 'BuildActionContext'" 
    } 

    Write-Host "Build action: $($Context.BuildAction)" 
} 

DoSomethingWithBuildActionContext -Context $buildActionContext 
DoSomethingWithBuildActionContext -Context "Hello world" 

Not: İkinci çağrı istisna mesajı verir.

cevap

6

Sadece gerçek .NET türlerinin parametre türünü belirtmek için kullanılabileceğini umuyorum. Essential PowerShell: Name your custom object types'a göre, özel tür adları çoğunlukla biçimlendirme için kullanılır.

Sen ValidateScript özelliğiyle elle tipi adlarını kontrol edebilirsiniz:

function DoSomethingWithBuildActionContext { 
    param(
    [Parameter()] 
    [ValidateScript({ $_.PSObject.TypeNames[0] -eq 'BuildActionContext' })] 
    $context 
) 
    Write-Host "Build action: $($Context.BuildAction)" 
} 
+1

Sağ, Yeni-Nesne türleri yaratmaz, bu türlerin örnekleri oluşturur. C# veya VB.NET ile bir tür oluşturmak için Add-Type kullanabilirsiniz. – JasonMArcher

+0

Cümle "Eğer isimleri elle kontrol edecekseniz, bunun için öznitelikleri kullanabilirsiniz:" gerçekten kafa karıştırıcı. Yazarın ne aktarmaya çalıştığından emin değilim ve kodda bana göre belli değil. –

+0

Omg, bu zaten 6 yıldır .. Cümleyi düzenlemeye çalışacağım. – stej

0

Harika bir soru. Ben

$buildActionContext -is [BuildActionContext] 

çalıştı Ve ilk örnekteki olsun hatayı olan

Unable to find type [BuildActionContext]: make sure that the assembly containing this type is loaded. 

olsun. Başımın üst kısmından, bu tür bir C# nesnesi oluşturmak isterdim, ama bu muhtemelen aşırı bir olasılık.

Aramaya devam edeceğim.

İlgili konular