Powershell 模块初始化

Jam*_*age 6 powershell module

加载模块时 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 成为与第一个片段提供的对象相同的对象句柄。

建议表示赞赏。

Χpẘ*_*Χpẘ 5

不清楚是要在加载模块时运行初始化代码(如 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,并且通常它的行为更像是具有属性和方法的典型对象。


And*_*ndi 2

模块实际上应该输出 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)