2017-05-10 2 views
1

ich versuche, ein Objekt mit benutzerdefinierten Methoden wie diese zu definieren, aber mein syntaxe ist falsch:So erstellen [PSCustomObject] mit Eigenschaften und Methoden

$Obj = [pscustomobject]@{ 
    A = @(5,6,7) 
    B = 9 
    Len_A = {return $this.A.count;} 
    Sum_A = {return (SumOf $this.A);} 
} 

zur Verwendung wie:

$Obj.Len_A()  # return 3 
$Obj.A += @(8,9) # @(5,6,7,8,9) 
$Obj.Len_A()  # return 5 
+2

Auf welche Version von PowerShell zielen Sie? –

Antwort

3

Sie wahrscheinlich wollen die Add-Member Cmdlets verwenden:

$Obj = [pscustomobject]@{ 
    A = @(5,6,7) 
    B = 9 
} 

$Obj | Add-Member -MemberType ScriptMethod -Name "Len_A" -Force -Value { 
    $this.A.count 
} 

Jetzt können Sie die Methode aufrufen, wie erwartet mit:

$Obj.Len_A() 
+0

Gut! aber Add-Member ist sehr langsam Funktion, siehe https://learn-powershell.net/2014/01/11/custom-powershell-objects-and-performance-revisited/ – Alban

+0

Nun, Sie wahrscheinlich * nicht * bauen ein Performance * Critical * Script, sonst hättest du das in deiner Frage erwähnt. Sie können also alle Leistungsvergleiche ignorieren, es sei denn, Ihr Skript wird langsam ausgeführt ... –

2

Sie erwähnen nicht, welche Version von Powershell Sie verwenden. Wenn Sie eine Objektorientierung wünschen, verwenden Sie eine Klasse wie diese.

class CustomClass { 
    $A = @(5,6,7) 
    $B = 9 
    [int] Len_A(){return $this.A.Count} 
    [int] Sum_A(){ 
     $sum = 0 
     $this.A | ForEach-Object {$sum += $_} 
     return $sum 
    } 
} 

$c = New-Object CustomClass 
$s = $c.Sum_A() 
$l = $c.Len_A() 
Verwandte Themen