Powershell 模块初始化

标签 powershell module

加载模块时,PowerShell 会调用任何初始化代码吗?

我正在寻找类似 Perl BEGIN block 或构造函数的东西。

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

理想情况下,我想将此代码放入模块中并使用以下内容:
$MyObj = Import-Module -Name ".\MyPackage" -AsCustomObject

并让 MyObj 成为与第一个片段提供的对象相同的句柄。

建议表示赞赏。

最佳答案

目前尚不清楚您是要在加载模块时运行初始化代码(如 Perl 的 BEGIN block )还是要创建自定义类(这是“构造函数”所建议的)。

模块中的初始化代码很容易。导入模块时,将执行模块中未嵌入函数的任何代码。

PS native 不支持创建自定义类。但请参阅:http://psclass.codeplex.com/ .也可以编写C#、VBScript等并使用Add-Type。

Import-module 不能模拟一个类,因为你只能有一个具有给定名称的模块实例——充其量你会有一个单例类。 (顺便说一句,import-module 确实有一个 -passthru 参数,它或多或少会使您的最后一行代码工作 - 作为一个单例。您还必须添加 export-module -variable * -function * 到您的模块代码)您可以使用 New-模块来模拟一个类。你可以将它包装在一个名为 new-myClass 的函数中。例如。

顺便说一句,如果您使用 -ASCustomObject 参数,您最终会得到一个不支持“this”的哈希表(换句话说,作为脚本 block 的哈希表值没有内置方式来引用哈希表本身) .如果您使用没有 -AsCustomObject 的 new-module(并且可能使用工厂函数,例如 new-myclass),那么您可以使用 & $myModule $varInMyModule 模拟“this.varInMyModule” .但是,如果您使用 Add-Member 创建 PSCustomObject,则脚本方法可以访问 $this,并且它通常更像具有属性和方法的典型对象。

关于Powershell 模块初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17625425/

相关文章:

xml - 在PowerShell中使用msbuild在NuGet中的安装事件上编辑csproj

在不同模块中使用的 Android 数据绑定(bind)

c - 内核模块中的进程描述符

c# - .NET 枚举类型实际上是可变值类型吗?

windows - 如何使用 Compress-Archive 的快捷路径将当前文件夹压缩到同一目的地

c# - 从 C# 运行 Powershell 会出现错误 : `running scripts is disabled on this system`

ruby - 你如何断言另一个 ruby​​ 模块的异常被抛出? (使用 assert_throws)

php - 用于查找是否存在类似问题的脚本

python导入模块全局本地命名空间

c# - 如何在C#中获取PowerShell的Get-Command的 `Suggestion`?