加载模块时 PowerShell 是否调用任何初始化代码?
我正在寻找类似 Perl BEGIN 块或构造函数的东西。
NEW-MODULE 和 IMPORT-MODULE 都将返回一个 PSCustomObject。我正在尝试将自定义对象封装在模块中以避免脚本中的冗长代码。在开放代码中测试良好的一种方法是:
$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
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想将此代码放入模块并使用以下内容:
$MyObj = Import-Module -Name ".\MyPackage" -AsCustomObject
Run Code Online (Sandbox Code Playgroud)
并让 MyObj 成为与第一个片段提供的对象相同的对象句柄。
建议表示赞赏。
不清楚是要在加载模块时运行初始化代码(如 Perl 的 BEGIN 块)还是要创建自定义类(这是“构造函数”建议的)。
模块中的初始化代码很容易。模块中未嵌入到函数中的任何代码都会在导入模块时执行。
PS 本身不支持创建自定义类。但请参阅:http : //psclass.codeplex.com/。也可以写C#、VBScript等,使用Add-Type。
导入模块无法模拟类,因为您只能有一个具有给定名称的模块实例 - 充其量只有一个单例类。(顺便说一句,import-module 确实有一个 -passthru 参数,这或多或少会使您的最后一行代码工作 - 作为单例。您还必须添加export-module -variable * -function *
到您的模块代码中)您可以使用 New-Module 来模拟一个班级。例如,您可以将其包装在一个名为的函数中new-myClass
。
顺便说一句,如果您使用 -ASCustomObject 参数,您最终会得到一个不支持“this”的哈希表(换句话说,脚本块的哈希表值没有内置的方式来引用哈希表本身) . 如果您使用没有 -AsCustomObject 的新模块(并且可能使用工厂函数,例如 new-myclass),那么您可以使用& $myModule $varInMyModule
. 但是,如果您使用 Add-Member 创建 PSCustomObject,则脚本方法可以访问 $this,并且通常它的行为更像是具有属性和方法的典型对象。
模块实际上应该输出 cmdlet,而不是对象。模块应提供一组相关的 cmdlet。有一种方法可以使用参数将数据发送到模块Import-Modules
,-ArgumentList
如下所示。例如,您可以使用该技术为您的 cmdlet 提供要连接的服务器名称。PowerCLI 模块使用一个 cmdlet 以不同的方式处理该问题,$script:connection
该 cmdlet 创建一个脚本作用域连接对象 ( ),其他 cmdlet 会检查该对象并重用该对象(如果存在),类似于:
#test.psm1
$script:myvar = "hi"
function Show-MyVar {Write-Host $script:myvar}
function Set-MyVar ($Value) {$script:myvar = $Value}
#end test.psm1
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5822 次 |
最近记录: |