11

我已经为此苦苦挣扎了一段时间。我打算为我的项目创建新的 PowerShell 模块。目的是将几个自定义 cmdlet 打包到独立单元中,我可以通过我们的 Nexus 存储库(或通过其他任何东西)将其部署到其他机器。

问题:在我所见的任何地方,我都能看到将所有 PowerShell 函数/cmdlet 打包到单个 *.psm1文件中的教程。文件存储在同名目录中,该目录实际上代表模块本身。

问题:有没有办法,如何将每个 cmdlet/函数分成独立文件?如果我有一个由多个 cmdlet 组成的模块,将它们全部放在单个 *.psm1 文件中不是很方便。

谢谢马修

4

3 回答 3

14

您也可以使用清单文件。“模块清单是一个包含哈希表的 .psd1 文件。哈希表中的键和值执行以下操作:

  • 描述模块的内容和属性。
  • 定义先决条件
  • 确定如何处理组件。

模块不需要清单。模块可以引用脚本文件 (.ps1)、脚本模块文件 (.psm1)、清单文件 (.psd1)、格式化和类型文件 (.ps1xml)、cmdlet 和提供程序程序集 (.dll)、资源文件、帮助文件、本地化文件,或作为模块的一部分捆绑的任何其他类型的文件或资源。对于国际化脚本,模块文件夹还包含一组消息目录文件。如果将清单文件添加到模块文件夹中,则可以通过引用清单将多个文件作为一个单元进行引用。”(来源

因此,您可以直接从 psd1 文件中使用 ps1 文件而不是 psm1 文件:

# Modules to import as nested modules of the module specified in RootModule/ModuleToProcess 
NestedModules = 'Get-WUList.ps1','Add-WUOfflineSync.ps1'

# Functions to export from this module 
FunctionsToExport = 'Get-WUList','Add-WUOfflineSync'
于 2015-04-15T07:21:00.633 回答
3

跟进@MatthewLowe - 我已将我的 .psm1 设为“单线”,如下所示;这似乎可行,前提是所有脚本都不依赖于其名称按字母顺序排列的脚本

Get-ChildItem -Path $psScriptRoot\*.ps1 | ForEach-Object { . $_.fullname; Export-ModuleMember -Function ([IO.PATH]::GetFileNameWithoutExtension($_.fullname)) }

于 2017-05-05T13:45:11.847 回答
1

只是发布这个我发现的答案,因为我实际上是在写问题本身:-)。我从互联网上下载了几个 PowerShell 模块并查看了里面,我在那里找到了答案。但是由于我在这个问题上停留了几个小时(powershell 的新手 ;-)),我还是决定为后代发布这个:-P。

您可以将每个 cmdlet(*.ps1 文件)放入单独的文件中。将它们存储在您的模块目录中并创建 *.psm1 文件。然后,将您的 *.ps1 cmdlet/函数点源到此 *.psm1。

但是,对存储 *.ps1 文件的当前模块目录的引用必须像这样提供
“.$psScriptRoot/moduleFunc1.ps1”而 不是../moduleFunc1.ps1

享受马修

于 2015-04-15T06:12:45.930 回答