gpt4 book ai didi

powershell - 新模块可以返回一个 psobject 吗?

转载 作者:行者123 更新时间:2023-12-03 17:56:46 25 4
gpt4 key购买 nike

下面的这个模块返回一个空对象。有什么建议可以解决吗?

New-Module -ScriptBlock { 
$resourcesDirectory="AA"
.....
$commonProperties = New-Object PSObject -Property @{
ResourcesDirectory = $resourcesDirectory
}

return $commonProperties
} -name GetXXX

最佳答案

PetSerAl 致敬寻求他的帮助。

New-Module 默认返回新创建的模块,作为 [System.Management.Automation.PSModuleInfo]实例。

我认为“返回一个空对象”是指 您的意图是让您的模块导出 $commonProperties变量 (它恰好包含一个 [pscustomobject] 实例,但这是偶然的),但您的代码未能这样做。

原因是在没有 Export-ModuleMember 的情况下调用、变量和别名 - 与函数不同 - 不会自动从模块中导出 .

注意事项 :

  • 如果有一个或多个 Export-ModuleMember调用存在,仅导出指定的成员(不会自动导出任何内容)。
  • Export-ModuleMember电话是 最好放在模块底部 定义,因为它们必须在元素定义之后才能导出。
  • 如果要将导入当前 session 的导出成员集限制为模块功能的子集,可以使用 New-Module-Function范围。
  • 如果该模块仅在当前 session 中使用,则组合 New-Module -Function 毫无意义与 Export-ModuleMember ;另请注意,使用 -Function将防止非功能成员被导入当前 session 。
  • 结合默认导出行为 New-Module -Function有效地提供了使用显式 Export-ModuleMember 的替代方法使用脚本 block 内的函数名称调用,但重要的是要了解这两种机制不同。

  • 导出变量$commonProperties ,您需要调用Export-ModuleMember -Variable commonProperties (注意变量名中必须缺少前缀 $):
    $newModule = New-Module -ScriptBlock { 
    $resourcesDirectory="AA"
    $commonProperties = New-Object PSObject -Property @{
    ResourcesDirectory = $resourcesDirectory
    }

    # You must explicitly export variable $commonProperties.
    # Note that `Export-ModuleMember` must generally come *after* the
    # definition of the variable, and that the variable name
    # must not be $-prefixed.
    Export-ModuleMember -Variable commonProperties

    # (No need to `return` anything from the script block.
    # Any output will be ignored.)
    } -name GetXXX

    鉴于 New-Module不仅会创建一个新模块,还会自动导入它, $commonProperties现在在当前 session 中可用。

    旁注 :

    通过添加开关 -ReturnResult ,你可以告诉 New-Module返回脚本 block 的输出 而不是新创建的模块对象(但模块仍然导入到当前 session 中)。

    应用于您的代码,将返回变量 $commonProperties 的值, 由于 return $commonProperties声明,但如前所述,您的脚本 block 不会导出任何成员,因此当前 session 不会看到 $commonProperties多变的。

    或者,切换 -AsCustomObject 告诉 New-Module返回 [pscustomobject]成员为导出成员的实例 .
    请注意,正常的导出规则适用,并且模块仍在幕后创建,尽管它没有被导入。

    应用于您的(更正的)代码,导出函数 Foo添加:
    $newObj = New-Module -ScriptBlock { 
    $resourcesDirectory="AA"
    $commonProperties = New-Object PSObject -Property @{
    ResourcesDirectory = $resourcesDirectory
    }
    function Foo { "I'm here." }
    Export-ModuleMember -Variable commonProperties -Function Foo
    } -AsCustomObject
    $newObj现在包含一个名为 commonProperties 的属性引用 $commonProperty来自新(隐藏)模块的脚本 block 的变量。

    注: Get-Member误导性地将此属性的类型报告为 NoteProperty ,建议一个静态值,而导出的函数可能会改 rebase 础变量的值(尽管这让我觉得这是一个奇特的情况)。真正的类型是 [System.Management.Automation.PSVariableProperty] ,如 $newObj.psobject.properties['commonProperties'].GetType().FullName揭示,而真正的 NoteProperty成员的类型为 [System.Management.Automation.PSNoteProperty] .

    同样,导出的函数 Foo表面为 ScriptMethod -在新(隐藏)模块的上下文中运行并查看其变量的类型成员(方法)。
    (顺便说一句: $newObj.Foo.Script.Module 可用于访问隐藏模块。)

    相比之下,导出的别名似乎被忽略了。

    警告:不要以相同的名称导出不同类型的成员(例如,不要定义同名的函数和变量),因为只有其中一个可以访问。

    关于powershell - 新模块可以返回一个 psobject 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37979829/

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