PowerShell:如何从模块文件psm1和外部ps1文件导出函数

时间:2014-09-01 14:38:01

标签: powershell powershell-v2.0 powershell-v3.0 powershell-ise

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

例如第一个函数太小或太简单而没有自己的文件,第二个函数是一个高级函数,需要自己的文件来保持对整个shabang的概述......

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

任何人都可以解释我将如何实现这一目标,我的尝试到目前为止会导致错误,但我已经完成了两次。

提前Tnx。

4 个答案:

答案 0 :(得分: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文件。

答案 1 :(得分:0)

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

步骤1:使用2个简单函数创建一个psm1文件,然后将它们两者导出。 这很好,并且符合预期

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

步骤3:在模块psm1文件的顶部添加一个dotourcing线。

PowerShell不会看到第3个功能

步骤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文件中的所有函数...这样所有函数都将被看到的powershell

答案 2 :(得分:0)

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

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

您可以在psd1清单的nested modules属性中列出ps1和psm1文件的相对路径

您还需要列出清单中要导出的所有功能。另请参见Get List Of Functions From Script

答案 3 :(得分:-1)

function Get-RunningServices {get-service | where-object {$_.Status -eq "running"}|Select-Object -Property DisplayName, Name| Sort-Object -property DisplayName}