2013-02-12 18 views
9

Probabilmente questa domanda ha avuto risposta prima .... ma non ho trovato una risposta specifica alle mie esigenze.Come creare oggetti reali con comportamento (metodi) in PowerShell?

BTW sto usando PowerShell 3

Beh, io sono nuovo in PowerShell, ma ho un sacco di esperienza come sviluppatore C#, in modo da lavorare con gli oggetti è molto importante per me.

quindi mi chiedo se c'è un modo pulito applicare concetti OOP (beh non tutti, anche se sarebbe fantastico) in uno script PowerShell, ad esempio, ci sono cose specifiche che vorrei fare.

Nota: sono consapevole di poter scrivere codice C# in PowerShell per creare DTO e anche di poter creare moduli binari PowerShell in C#, l'ho già fatto in passato, ma quello che sto cercando ora è la possibilità di scrivere tutto il mio codice in PowerShell ma in modo orientato agli oggetti.

cose che vorrei fare:

  • Creare un oggetto in PowerShell, ed espongono una funzione scritta in PowerShell pure, qualcosa di simile:

    function New-Person 
    (
        [Parameter()][string]$firstName 
    ) 
    { 
        function Walk() 
        { 
         Write-Host "Walking..."; 
        } 
    
        $person = New-Object psobject; 
    
        $person | Add-Member -MemberType NoteProperty -Name FirstName -Value $firstName; 
    
        #This line does not work 
        #$person | Add-Member -MemberType CodeMethod -Name Walk -Value Walk; 
    
        return $person; 
    } 
    
    $MyPerson = New-Person -firstName "JP"; 
    
    $MyPerson; 
    
    #This line does not work 
    $MyPerson.Walk(); 
    
  • comportamento Incapsula, che significa creare funzioni all'interno dell'oggetto e quindi contrassegnarle come private

  • [Bello da avere]. Creare classi base in modo che io possa ereditare e specializzare i miei metodi prevalenti di comportamento

  • [Bello da avere]. Creare interfacce in modo da poter cominciare a pensare in unit testing in isolamento miei metodi PowerShell (so che ci sono strumenti come Pester per fare questo sto solo concentrando sulle caratteristiche OOP)

Quello che ho fatto finora è creazione di oggetti con proprietà solo (di DTO) ma mi piacerebbe aggiungere un comportamento ai miei oggetti

ti sarei grato se voi ragazzi mi punto nella giusta direzione

risposta

10

Due opzioni per creare oggetti con i metodi:

  1. Add-Member
  2. New-Module -AsCustomObject

Codice campioni:

$person | Add-Member -MemberType ScriptMethod -Value { 
    'I do stuff!' 
} 

$person = New-Module -AsCustomObject -ScriptBlock { 
    $Property = 'value' 
    [string]$Other = 'Can be strongly typed' 

    function MyMethod { 
     'I do stuff!' 
    } 

} 

EDIT: si parla di pubblico/privato ... In proprietà esempio quest'ultimo non sarà visualizzato "di default". Puoi decidere cosa è pubblico utilizzando Export-ModuleMember e specificare -Variable (proprietà) e/o -Function (metodi) che saranno pubblici. Senza esplicito Export-ModuleMember si comporterà come nel modulo "normale" - esporta solo le funzioni (metodi).

+0

Questo sembra davvero interessante, lo sto testando proprio ora – Jupaol

+0

Entrambi gli esempi funzionano alla grande. Mi piacerebbe usare il primo. C'è un modo per chiedere i parametri nel corpo di 'ScriptMethod' -' Value'? essere in grado di fare qualcosa come '$ MyPerson.Walk (" numero di miole o whateva ");' – Jupaol

+4

Aggiungere un normale blocco 'param' all'interno della definizione della funzione. per esempio. '$ obj =" pippo "| Add-Member -MemberType ScriptMethod -Value {param ($ first, $ second) "first è $ first, second is $ second"} -Name DoStuff -PassThru; $ obj.DoStuff ('abc', '123') ' – latkin

5

Se si desidera completo OOP (incluso l'ereditarietà, sebbene non le interfacce), quindi PSClass è un'implementazione con licenza MS-PL.

+0

Solo per la cronaca, non ho votato la tua risposta, ho già trovato quel progetto e sto facendo alcune dimostrazioni di concetti. Votare questa risposta – Jupaol

+0

Nice ... +1 e dovrà giocarci. – BartekB

4

PowerShell v5 introduce il supporto completo della classe, semplificando la creazione di classi personalizzate con proprietà e metodi di implementazione.

Dai un'occhiata al post sul blog di Trevor sull'argomento. Trevor Sullivan, Implementing a .net Class

+0

Grazie per il link, è esattamente quello che non sono riuscito a trovare da solo. –

Problemi correlati