【问题标题】:PowerShell module - separate file for each cmdletPowerShell 模块 - 每个 cmdlet 的单独文件
【发布时间】:2015-06-20 23:22:05
【问题描述】:

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

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

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

谢谢 马修

【问题讨论】:

    标签: powershell cmdlets powershell-module


    【解决方案1】:

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

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

    但是,必须像这样提供对存储 *.ps1 文件的当前模块目录的引用
    ".$psScriptRoot/moduleFunc1.ps1" AND NOT LIKE " ../moduleFunc1.ps1"

    享受 马修

    【讨论】:

      【解决方案2】:

      您也可以使用清单文件。 “模块清单是一个包含哈希表的 .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'
      

      【讨论】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-06-19
        • 2021-10-20
        • 2018-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多