我试图在pester的帮助下测试一些自定义的DSC资源。但是,我正在努力研究如何使类可用于不同的文件。这不是一个纠缠不清的问题,我也不能在powershell中做到这一点。我有一个带有类的模块,类似于SxDeployment.psm1文件中的以下内容
[DscResource()]
class SxWindowsService {
[void]Set(){
}
[bool]Test(){
return $true;
}
[SxWindowsService]Get(){
return $this
}
}
此模块具有相应的.psd1,它将SxWindowsService类列为“DscResourcesToExport”。它被注册为一个模块,当我执行Get-Module -ListAvailable时我可以看到这个模块,并且还可以在它上面执行Import-Module。
我想我的问题是如何从另一个文件创建对此类的引用?
假设我有一个不同的文件test.ps1,其中包含以下内容
Import-Module SxDeployment
$class = [SxWindowsService]::new()
我收到以下错误,“无法找到类型[SxWindowsService]。”
更新 经过一些修补,我可以通过将.psm1文件更改为.ps文件并更改import-module语句来创建该类的实例。 \ SxDeployment.ps1。所以似乎问题是如何消耗DSC配置之外的DSC资源模块文件中定义的资源?
答案 0 :(得分:3)
类型文字[SxWindowsService]无法在模块外部访问。这是设计的。以下是发行说明中的引用:
课程关键字>>>定义一个新类。这是一个真正的.NET Framework类型。 类成员是公共的,但只在模块范围内公开。您不能将类型名称称为字符串(例如,New-Object不起作用),在此版本中,您不能使用类型文字(例如,[MyClass])在定义类的脚本/模块文件之外。
编辑:
之后说了上面的话。由于.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