PowerShell模块-每个cmdlet的单独文件

PowerShell模块-每个cmdlet的单独文件,powershell,cmdlets,powershell-module,Powershell,Cmdlets,Powershell Module,我已经为此绞尽脑汁好一阵子了。我打算为我的项目创建新的PowerShell模块。目的是将几个定制cmdlet打包到独立单元中,我可以通过Nexus存储库(或其他任何方式)将其部署到其他机器上。 问题:我到处都能看到将所有PowerShell函数/cmdlet打包到单个*.psm1文件中的教程。文件存储在同名目录中,该目录实际上表示模块本身。 问题:是否有办法将每个cmdlet/函数分离到独立文件中?如果我有一个由多个cmdlet组成的模块,那么将它们全部放在一个*.psm1文件中不是很方便

我已经为此绞尽脑汁好一阵子了。我打算为我的项目创建新的PowerShell模块。目的是将几个定制cmdlet打包到独立单元中,我可以通过Nexus存储库(或其他任何方式)将其部署到其他机器上。 问题:我到处都能看到将所有PowerShell函数/cmdlet打包到单个*.psm1文件中的教程。文件存储在同名目录中,该目录实际上表示模块本身。 问题:是否有办法将每个cmdlet/函数分离到独立文件中?如果我有一个由多个cmdlet组成的模块,那么将它们全部放在一个*.psm1文件中不是很方便

谢谢
马修(Matthew)

刚刚发布了这个答案,这是我在写问题时发现的:-)。我从互联网上下载了几个PowerShell模块,并查看了里面,我在那个里找到了答案。但是,由于我在这个问题上被困了几个小时(powershell的新手;-),我决定无论如何都把它贴出来,以供子孙后代使用。 您可以将cmdlet(*.ps1文件)分别放入单独的文件中。将它们存储在模块目录中并创建*.psm1文件。然后,将*.ps1 cmdlet/函数源代码添加到此*.psm1中。 但是,必须像这样提供对存储*.ps1文件的当前模块目录的引用
“$psScriptRoot/moduleFunc1.ps1”而不是类似的”。/moduleFunc1.ps1”

享受
Matthew

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

  • 描述模块的内容和属性
  • 定义先决条件
  • 确定如何处理组件
模块不需要清单。模块可以引用脚本文件(.ps1)、脚本模块文件(.psm1)、清单文件(.psd1)、格式和类型文件(.ps1xml)、cmdlet和提供程序程序集(.dll)、资源文件、帮助文件、本地化文件或捆绑为模块一部分的任何其他类型的文件或资源。对于国际化脚本,模块文件夹还包含一组消息目录文件。如果将清单文件添加到模块文件夹,则可以通过引用man将多个文件作为单个单元引用我最喜欢。”()

因此,您可以直接从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'

在@MatthewLowe的后续工作中,我将我的.psm1作为“一行程序”,如下所示;这似乎是可行的,前提是没有一个scriptlet依赖于名称后面按字母顺序排列的脚本:


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

当您通过cmdlet导入模块导入模块时,需要将其指向现有的*.psm1文件。尽管*.psd1存在于我的目录中(它包含关于开发人员和公司的元信息),但它只提供包含/排除模块中存在的某些cmdlet/函数的功能。但是,模块中是否存在cmdlet/函数取决于它们在*.psm1文件中的存在(无论是直接还是通过点源)。还是我遗漏了什么?您能否提供一些示例,说明如何通过*.psd1文件将cmdelets包含在模块中?:-)您可以使用ps1文件定义
NestedModules
,而无需使用psm1文件:#要导入的模块作为RootModule/ModuleToProcess NestedModules='Get-WUList.ps1','Add-WUOfflineSync.ps1'中指定模块的嵌套模块#要从此模块导出的函数导出='Get WUList',“Add WUOfflineSync”`我已将我的上一个信息添加到我的答案中,以供将来参考。作为附录,您可以使用嵌套模块属性中的文件夹:
NestedModules='Credentials\Set ServiceCredential.ps1','Prod\Restart ProdServices.ps1'
将从文件夹中加载ps1文件。您也不能使用通配符一次加载整个文件夹。