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

PowerShell:如何将函数从模块文件psm1导出为外部ps1文件,powershell,powershell-2.0,powershell-3.0,powershell-ise,Powershell,Powershell 2.0,Powershell 3.0,Powershell Ise,我试图找出如何既导出在psm1文件中写入的模块成员(函数),又导出在自己的ps1文件中写入的成员函数。 但两者都需要作为同一模块/项目的成员导出 例如,第一个函数太小或太简单,没有自己的文件,第二个函数是一个高级函数,它确实需要自己的文件来保存整个沙邦的概览 现在,我将如何导出这两种情况,甚至为这两种情况分配一个别名 谁能解释一下我是如何做到这一点的,我的尝试到目前为止导致了错误,尽管我分别做到了这两个 提前Tnx。您是否尝试过网络采购 它不会将ps1作为模块的一部分加载(因为函数需要在模块中,

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

例如,第一个函数太小或太简单,没有自己的文件,第二个函数是一个高级函数,它确实需要自己的文件来保存整个沙邦的概览

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

谁能解释一下我是如何做到这一点的,我的尝试到目前为止导致了错误,尽管我分别做到了这两个


提前Tnx。

您是否尝试过网络采购

它不会将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:使用2个简单函数创建一个psm1文件,然后将它们导出。 这很好,正如预期的那样

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

步骤3:在模块psm1文件的顶部添加点源代码行

PowerShell不会看到第三个函数

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

步骤5:将这两个函数添加到psd1文件中的“FunctionsToExport”中 PowerShell看到了所有功能,一切正常,如预期的那样

步骤6:注释掉psm1文件顶部的dotsourcing代码行 单击时,函数三消失(这是外部函数) psm1文件中的函数1和2工作正常

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

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

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


在完成这些步骤后,我看不到任何其他方法,然后从psm1文件中查找外部ps1文件,同时告诉psd1文件中的所有函数。。。通过这种方式,powershell将看到所有函数。dotsourcing的替代方案是使用清单的嵌套模块属性

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

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


您还需要在清单中列出要导出的所有函数。另请参见

为什么要这样做?你想解决什么问题?我只是想知道怎么做,因为对我来说,这似乎是一个或另一个,我没有解决任何问题,然后在psm1文件中整合一个小函数,让一个更大的函数有自己的ps1文件,然后仍然让它们从同一个模块导出。我一次只能用一种方式工作,而且不是模拟的…事实上也是这样。他们的psm1文件是完全空的,除了解除阻止文件并对其进行dotsourcing,我想我可以把这两种方法结合起来。你可以创建一个包含大量点源代码的模块文件,它可以工作,但这有点违背了IMO模块的目的。但是你可以通过在模块内部使用上面的示例来实现“点源代码”多个文件和简单的
Import模块
我猜dotsourcing模块中的函数并在psd1文件中引用它们是解决方案tnxMy dotsourcing代码行,我从PSWindowsUpdate模块
Get ChildItem-Path$PSScriptRoot\*.ps1 | Foreach对象{.$\uuuz.FullName}中获取该代码行
因为当您选择导出模块的特定部分时,powershell会忽略未导出的部分。我的模块中有
Export ModuleMember-Alias*-Function*
,如果我取出
-Function
,我不会得到任何函数,因为我特别告诉powershell只导出别名。如果有3个函数,而你只在
函数中添加1导出
powershell将忽略2而只导出1。是的,我明白,我只是想了解它的更深层次,我想我也回答了我自己的问题,我明白了为什么我甚至开始写这篇文章来同时让这两个案例工作,现在,我留下了一个关于如何实现几种情况的小模块示例:)我现在完全相信now btw是因为psd1文件覆盖了psm1文件中的任何显式导出,但没有在psm1文件中完全包含它们,没有点源代码行,所以微软应该给我们这种可能性,我认为,从某种意义上讲,这似乎是逻辑,但并不完全是逻辑。当已经有了一个非常简单的解决方案(模块中的函数)时,逻辑难道不要求您将函数放在模块中,以避免进行所有这些工作吗?