gpt4 book ai didi

Powershell 模块初始化

转载 作者:行者123 更新时间:2023-12-03 16:45:30 25 4
gpt4 key购买 nike

加载模块时,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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com