12

おそらく、この質問は以前に回答されています....しかし、私のニーズに対する具体的な回答は見つかりませんでした。

ところで、私はPowerShell 3を使用しています

私は PowerShell の初心者ですが、C# 開発者として多くの経験があるので、オブジェクトを操作することは私にとって非常に重要です。

そのため、PowerShell スクリプトでOOP の概念(すべてではありませんが、すべてではありません)を適用するクリーンな方法があるかどうか疑問に思っています。たとえば、私がやりたい特定のことがあります。

注: PowerShell で C# コードを記述して DTO を作成できることと、C# で PowerShell バイナリ モジュールを作成できることは認識しています。過去にそれを行ったことがありますが、今探しているのは、すべてのコードは PowerShell で作成されていますが、オブジェクト指向の方法で作成されています。

私がやりたいこと:

  • PowerShell でオブジェクトを作成し、同様に PowerShell で記述された関数を次のように公開します。

    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();
    
  • 動作をカプセル化します。これは、オブジェクト内に関数を作成し、それらをプライベートとしてマークすることを意味します

  • [あった方がよい]。メソッドをオーバーライドする動作を継承して特殊化できるように、基本クラスを作成します。

  • [あった方がよい]。インターフェイスを作成して、PowerShell メソッドを分離して単体テストで考え始めることができるようにします (これを行うための Pester のようなツールがあることは知っていますが、OOP 機能に焦点を当てています)。

これまでに行ったことは、プロパティのみ (DTO) を持つオブジェクトを作成することですが、オブジェクトに動作を追加したいと思います

皆さんが私を正しい方向に向けてくれれば幸いです

4

3 に答える 3

13

メソッドでオブジェクトを作成するための 2 つのオプション:

  1. 追加メンバー
  2. 新しいモジュール -AsCustomObject

コードサンプル:

$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!'
    }

}

編集:プライベート/パブリックについて言えば...後者の例では、プロパティは「デフォルトで」表示されません。何を使用して公開するかを決定し、公開する(プロパティ) および/または(メソッド) をExport-ModuleMember指定できます。明示的に指定しないと、「通常の」モジュールと同じように動作します - 関数 (メソッド) のみをエクスポートします。-Variable-FunctionExport-ModuleMember

于 2013-02-12T15:37:14.343 に答える
7

PowerShell v5 では完全なクラス サポートが導入されているため、プロパティを使用して独自のクラスを簡単に作成し、メソッドを実装できます。

このトピックに関する Trevor の素晴らしいブログ投稿をチェックしてください。Trevor Sullivan、.net クラスの実装

スタンドアロンの例

これは Fox と呼ばれる構成された型の PowerShell クラスです。これには.Deploy()メソッドがあり、これがどのように行われるかを示す必要があります。

class Fox {
    # describes the sixe of the fox
    [String] $Size;
    # Property: the foxes color
    [String] $Color;

    # Constructor: Creates a new Fox object, with the specified
    #              size and name / owner.
    Fox([string] $NewSize, [String] $NewName) {
        # describes the sixe of the fox
        $this.Size = $NewSize;
        # Property: the foxes color
        $this.Color = $NewName;
    }

    # Method: Change the size of the fox     
    [void] Morph([UInt32] $Amount) {
        try {
            $this.Size = $this.Size - $Amount;
        }
        catch {
            Write-Warning -Message 'You tried to set an invalid size!';
        }
    }

    # Method: BreakGlass resets the beer size to 0.
    [void] Deploy() {
        Write-Warning -Message "The $($this.Color) fox, which is $($this.Size) in stature, goes off into the distance"        
    }
}

そして実際には: ここに画像の説明を入力

于 2015-01-07T14:00:50.780 に答える
4

完全なOOP (インターフェイスではなく継承を含む)が必要な場合、 PSClassは MS-PL ライセンスの実装です。

于 2013-02-13T12:12:01.030 に答える