1

ペスターの助けを借りて、クラスとして記述されたいくつかのカスタム DSC リソースをテストしようとしています。ただし、クラスを別のファイルで使用できるようにする方法を見つけるのに苦労しています。これは実際には厄介な問題ではありません.powershellでもこれを行うことはできません. SxDeployment.psm1 ファイルの次のようなクラスを含むモジュールがあります。

[DscResource()]
class SxWindowsService {
    [void]Set(){
    }
    [bool]Test(){
        return $true;
    }
    [SxWindowsService]Get(){
        return $this
    }
}

このモジュールには、SxWindowsService クラスを 'DscResourcesToExport' としてリストしている対応する .psd1 があります。モジュールとして登録されています。Get-Module -ListAvailable を実行するとこのモジュールが表示され、Import-Module を実行することもできます。

私の質問は、別のファイルからこのクラスへの参照を作成するにはどうすればよいですか?

次のような別のファイル test.ps1 があるとします

Import-Module SxDeployment

$class = [SxWindowsService]::new()

「タイプ [SxWindowsService] が見つかりません」というエラーが表示されます。

更新 もう少しいじくり回した後、.psm1 ファイルを .ps ファイルに変更し、import-module ステートメントを . .\SxDeployment.ps1. 問題は、DSC 構成の外部にある DSC リソース モジュール ファイルで定義されたリソースをどのように消費するかということです。

4

1 に答える 1

3

型リテラル [SxWindowsService] は、モジュールの外ではアクセスできません。これは仕様によるものです。以下はリリースノートからの引用です。

クラスキーワード >>> 新しいクラスを定義します。これは真の .NET Framework 型です。クラス メンバーは公開されますが、モジュール スコープ内でのみ公開されます。型名を文字列として参照することはできません (たとえば、New-Object は機能しません)。また、このリリースでは、型リテラル ([MyClass] など) を script/ の外で使用することはできません。クラスが定義されているモジュールファイル。

編集:

さて、上記のことを言った後。.NET と PowerShell でのオブジェクトのアクティブ化には多少の不一致があるため、何か方法があるのではないかと考えました。そして、私はそれを見つけました:

Import-Module C:\ps\StackOverflow\32743812\issue.psm1 -Force
function New-PSClassInstance {
    param(
        [Parameter(Mandatory)]
        [String]$TypeName,
        [object[]]$ArgumentList = $null
    )
    $ts = [System.AppDomain]::CurrentDomain.GetAssemblies() |
        Where-Object Location -eq $null | 
            Foreach-Object {
                $_.Gettypes()
            } | Where-Object name -eq $TypeName |
                Select-Object -Last 1
    if($ts) {
        [System.Activator]::CreateInstance($ts,$ArgumentList )
    } else {
        $typeException = New-Object TypeLoadException $TypeName        
        $typeException.Data.Add("ArgumentList",$ArgumentList)
        throw $typeException
    }
}
New-PSClassinstance -TypeName SxWindowsService
于 2015-09-23T19:05:34.400 に答える