6

モジュールが読み込まれると、PowerShell は初期化コードを呼び出しますか?

Perl BEGIN ブロックまたはコンストラクターのようなものを探しています。

NEW-MODULE と IMPORT-MODULE はどちらも PSCustomObject を返します。スクリプト内の長いコードを避けるために、カスタム オブジェクトをモジュールにカプセル化しようとしています。オープン コードで適切にテストされる 1 つの方法は次のとおりです。

$m = new-module -scriptblock {
New-Object PSCustomObject | 
    Add-Member NoteProperty -name person -value Frodo -passthru | 
    Add-Member ScriptMethod Who { $this.person }  -passthru |
    Add-Member ScriptMethod Mod { 
        param($x)
        $this.person = $x
        } -passthru
} -ascustomobject -returnresult

理想的には、このコードをモジュールにドロップして、次のようなものを使用したいと思います。

$MyObj = Import-Module -Name ".\MyPackage" -AsCustomObject

最初のスニペットが提供するのと同じように、MyObj をオブジェクトへのハンドルにします。

提案をいただければ幸いです。

4

3 に答える 3

5

モジュールがロードされたときに初期化コードを実行したいのか (Perl の BEGIN ブロックのように)、カスタム クラスを作成したいのか (これは "コンストラクター" が示唆することです) は明確ではありません。

モジュール内の初期化コードは簡単です。関数に埋め込まれていないモジュール内のコードは、モジュールがインポートされるときに実行されます。

カスタム クラスの作成は、PS ではネイティブにサポートされていません。ただし、http: //psclass.codeplex.com/を参照してください。C# や VBScript などを記述して Add-Type を使用することもできます。

特定の名前のモジュールのインスタンスは 1 つしか持てないため、import-module はクラスのシミュレーションには機能しません。せいぜいシングルトン クラスしか持てません。(ところで、 import-module には -passthru パラメータがあります。これにより、コードの最後の行がシングルトンとして動作します。またexport-module -variable * -function *、モジュール コードに追加する必要があります) New-Module を使用してシミュレートできます。クラスだけど。new-myClassそして、たとえば、という名前の関数でラップできます。

ところで、-ASCustomObject パラメーターを使用すると、「this」をサポートしないハッシュテーブルになってしまいます (つまり、スクリプト ブロックであるハッシュ テーブルの値には、ハッシュ テーブル自体を参照する組み込みの方法がありません)。 . -AsCustomObject を指定せずに new-module を使用する場合 (および、new-myclass などのファクトリ関数を使用する可能性がある場合)、"this.varInMyModule" を でシミュレートできます& $myModule $varInMyModule。ただし、Add-Member を使用して PSCustomObject を作成すると、スクリプト メソッドは $this にアクセスできるようになり、一般に、プロパティとメソッドを持つ典型的なオブジェクトのように動作します。

于 2013-07-14T01:50:27.550 に答える
2

モジュールは、実際にはオブジェクトではなくコマンドレットを出力することになっています。モジュールは、関連する一連のコマンドレットを提供する必要があります。ここに示すように、パラメータを使用してモジュールにデータを送信する方法がありImport-Modulesます。たとえば、この手法を使用して、コマンドレットが接続するサーバー名を指定できます。PowerCLI モジュールは、スクリプト スコープ接続オブジェクト ( ) を作成するコマンドレットを使用して、これを別の方法で処理します。他のコマンドレットはこの接続オブジェクトをチェックし、存在する場合は再利用します。-ArgumentList$script:connection

#test.psm1
$script:myvar = "hi"
function Show-MyVar {Write-Host $script:myvar}
function Set-MyVar ($Value) {$script:myvar = $Value}
#end test.psm1
于 2013-07-13T02:14:19.460 に答える