【问题标题】:PowerShell: How to export a function from the module file psm1 and as external ps1 filePowerShell:如何从模块文件 psm1 和外部 ps1 文件中导出函数
【发布时间】:2014-10-25 19:41:40
【问题描述】:

我试图找出如何导出写入 psm1 文件中的模块成员(函数)和写入其自己的 ps1 文件中的成员函数。 但两者都需要作为同一个模块/项目的成员导出......

例如第一个函数太小或太简单以至于没有自己的文件,第二个函数是一个高级函数,它需要自己的文件来保持整个沙帮的概览......

现在我将如何导出这两种情况,甚至为这两种情况分配别名...

谁能解释我将如何实现这一目标,到目前为止我的尝试导致错误,尽管我分别实现了这两个目标。

提前发送。

【问题讨论】:

  • 你为什么要这样做?你想解决什么问题?
  • 我只是想知道如何做到这一点,因为对我来说它似乎是一个或另一个,我没有解决任何问题,然后在 psm1 文件中合并一个小函数并让一个更大函数有自己的 ps1 文件,然后仍然从同一个模块导出它们。我一次只能获得一种工作方式,而不是模拟...

标签: powershell powershell-2.0 powershell-3.0 powershell-ise


【解决方案1】:

您是否尝试过点源?

它不会将 ps1 作为模块的一部分加载(因此该函数需要在模块中,而不是在单独的 ps1 文件中),但它仍会从中加载函数。

# Load the module
Import-Module ".\MyPowershellModule.psm1"

# Load the ps1
. ".\MyPowershellScript.ps1"

# Use a function from ps1
FunctionFromPs1 -ThisParam -ThatParam

# Use a function from module
FunctionFromModule -ThisParam -ThatParam

我能想到的唯一其他方法(我会强烈建议不要这样做)是在模块中点源 ps1 并加载模块

是否有不能将函数添加到模块的原因?模块应该是一个大型的函数库(我个人是 3k+ 行)。我同意将所有功能放在一个文件中可能会让人不知所措,但将它们放在一个位置优于拥有 30 个 ps1 文件。

【讨论】:

  • 其实link 也是这样做的。
  • 他们的 psm1 文件是完全空的,除了解锁文件和点源,我想我可以结合这两种方式。
  • 好吧,你可以创建一个包含一堆点源的模块文件,它会起作用,但这有点违背了模块 IMO 的目的。但是,您可以通过在模块中使用上面的示例来“点源”多个文件和简单的 Import-Module
  • 我猜想将模块中的函数点源化并在 psd1 文件中引用它们是解决方案 tnx
【解决方案2】:

点源的替代方法是使用清单的嵌套模块属性

根据https://docs.microsoft.com/en-us/powershell/scripting/developer/module/how-to-write-a-powershell-module-manifest?view=powershell-7.1

您可以在 psd1 清单的嵌套模块属性中列出 ps1 和 psm1 文件的相对路径

您还需要在清单中列出所有要导出的函数。另见Get List Of Functions From Script

【讨论】:

    【解决方案3】:

    这些是我采取的一些步骤......

    第 1 步:创建一个具有 2 个简单函数的 psm1 文件,然后将它们都导出。 这工作正常,符合预期

    第 2 步:使用第 3 个函数的名称创建一个外部文件。 PowerShell 看不到第三个函数

    第 3 步:在模块 psm1 文件的顶部添加一条点源线。

    PowerShell 看不到第三个函数

    第 4 步:创建一个 psd1 文件并将第三个函数添加到“FunctionsToExport”。 Powershell 看不到前两个函数

    第 5 步:将这两个函数添加到 psd1 文件中的“FunctionsToExport”中 PowerShell 可以查看所有功能,并且一切正常并按预期运行

    第 6 步:注释掉 psm1 文件顶部的点源代码行 单击时功能三个消失(这是外部功能) psm1 文件中的函数 1 和 2 工作正常。

    第 7 步:将所有文件添加到 psd1 文件的 FileList 属性中 与步骤 6 相同的情况

    第 8 步:将 psm1 文件添加到 psd1 文件的 ModuleList 属性中。 与步骤 6 相同的情况

    第 9 步:将(外部)函数 3 添加到 psd1 文件的 ScriptsToProcess 属性中 与步骤 6 相同的情况

    在采取这些步骤之后,我看不到任何其他方式,然后从 psm1 文件中点源外部 ps1 文件,同时告诉 psd1 文件中的所有功能......这样所有功能都将被看到外壳

    【讨论】:

    • 我从 PSWindowsUpdate MOdule Get-ChildItem -Path $PSScriptRoot\*.ps1 | Foreach-Object{ . $_.FullName } 获取的 Dotsourcing 代码线
    • 因为当您选择导出模块的特定部分时,powershell 会忽略那些您不导出的部分。我的模块中有Export-ModuleMember -Alias * -Function *,如果我取出-Function,我不会得到任何 功能,因为我已经明确告诉powershell 只导出别名。如果有 3 个函数,而你只在 FunctionsToExport 中添加 1,powershell 将忽略 2,只导出 1。
    • 真的,我明白,我想这只是想了解它的更深层次,我想我也回答了我自己的问题,我明白了为什么我什至开始这篇文章是为了得到这两种情况立即工作,现在我留下了一个如何实现几个案例的迷你模块示例:)
    • 我现在完全相信现在顺便说一句,因为 psd1 文件覆盖了 psm1 文件中的任何显式导出,但在 psm1 文件中没有点源行的情况下没有完全包含它们是不是微软应该给我们这种可能性,我认为,这似乎是一种逻辑,但并不完全
    • 当已经有一个非常简单易用的解决方案(模块中的函数)时,难道逻辑不会要求您将函数放在模块中以避免进行所有这些工作吗?
    【解决方案4】:
    function Get-RunningServices {get-service | where-object {$_.Status -eq "running"}|Select-Object -Property DisplayName, Name| Sort-Object -property DisplayName}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-19
      • 2017-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多