我现在已经有一段时间了。我打算为我的项目创建新的PowerShell模块。目标是将多个自定义cmdlet打包到独立单元中,我可以通过我们的Nexus存储库(或通过其他任何方式)将其部署到其他计算机。
问题:我看到的每个地方,都会看到教程将所有PowerShell函数/ cmdlet 打包成单个* .psm1 文件。文件存储在同名目录中,实际上代表模块本身。
问题:有没有办法,如何将每个cmdlet /函数分成独立文件?如果我有一个由几个cmdlet组成的模块,将它们全部放在单个* .psm1文件中并不是很方便。
由于 马修
答案 0 :(得分:13)
您还可以使用清单文件。 “模块清单是包含哈希表的.psd1文件。哈希表中的键和值执行以下操作:
模块不需要清单。模块可以引用脚本文件(.ps1),脚本模块文件(.psm1),清单文件(.psd1),格式和类型文件(.ps1xml),cmdlet和提供程序集(.dll),资源文件,帮助文件,本地化文件,或作为模块一部分捆绑的任何其他类型的文件或资源。对于国际化脚本,模块文件夹还包含一组消息目录文件。如果将清单文件添加到模块文件夹,则可以通过引用清单将多个文件作为单个单元引用。“(Source)
因此您可以直接从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'
答案 1 :(得分:2)
跟进@MatthewLowe - 我已经将我的.psm1变成了“单行”,如下所示;这似乎有用,前提是没有一个scriptlet依赖于其名称按字母顺序排列的脚本:
Get-ChildItem -Path $psScriptRoot\*.ps1 | ForEach-Object { . $_.fullname; Export-ModuleMember -Function ([IO.PATH]::GetFileNameWithoutExtension($_.fullname)) }
答案 2 :(得分:0)
只是发布了我发现的这个答案,因为我实际上是在问自己:-)。我从互联网上下载了一些PowerShell模块并向内看,我在那里找到了答案。但是因为我被困在这几个小时(对于PowerShell来说是新的;-)),所以我决定发布这个,为后代:-P。
您可以将cmdlet(* .ps1文件)EACH放入单独的文件中。将它们存储在模块目录中并创建* .psm1文件。然后,将* .ps1 cmdlet / functions点源到此* .psm1。
但是,必须像这样提供对存储* .ps1文件的当前模块目录的引用 “。$ psScriptRoot / moduleFunc1.ps1” AND NOT LIKE “ ../moduleFunc1.ps1”
享受 马修