Powershell模块中* .psm1文件的用途是什么?

时间:2019-04-27 02:51:29

标签: powershell module

因此,我实现了第一个Powershell模块,其中包含一堆.ps1文件(每个函数一个)和.psd1清单文件。

我试图了解.psm1文件的用途-我的模块中是否需要它们?

它们的附加值是什么?

编辑1

这是我的.psd1文件:

@{
    ModuleVersion = "0.0.19106.59054"
    GUID = "59bc8fa6-b480-4226-9bcc-ec243102f3cc"
    Author = "..."
    CompanyName = "..."
    Copyright = "..."
    Description = "..."
    ScriptsToProcess = "vsts\config.ps1"
    VariablesToExport = @(
        "TfsInstanceUrl",
        "TfsApiVersion",
        "QANuGetRepoUrl"
    )
    NestedModules = @(
        "db\Backup-Database.ps1",
        ...
        "vsts\work\Get-WorkItems.ps1"
    )
    FunctionsToExport = @(
        "Assert-ExtractionDestFolder",
        ...
        "Write-HostIfNotVerbose"
    )
    PrivateData = @{
        PSData = @{
            ExternalModuleDependencies = "SqlServer"
        }
    }
}

就像我说的那样,每个函数都在自己的文件中。

2 个答案:

答案 0 :(得分:1)

  

.psm1文件的用途是什么-我的模块中是否需要它们?

  • 脚本模块中,即在PowerShell中编写的模块(与已编译的二进制cmdlet相反),它仅是*.psm1文件,这些文件提供与常规*.ps1脚本文件不同的模块特定行为(单独,隔离的作用域,专用命令,对导出命令的控制)。

    • 通常,脚本模块清单具有一个RootModule条目,该条目指向(主)*.psm1文件;对于较小的模块,在这个*.psm1文件中实现模块功能的 all 并不少见。

      • 事实上,独立 *.psm1文件也可以充当模块,尽管它不与PowerShell的模块自动发现和自动加载功能集成在一起

      • 请注意,如果您要直接在*.ps1中使用常规RootModule脚本,则其定义将被加载到调用者的范围内,而不是模块的范围内;也就是说,您将失去模块的好处。

  • 即使您在*.ps1清单条目中列出了常规NestedModules脚本,但由于使用了该特定条目,这些脚本仍是中的点源模块的上下文,从而成为模块的一部分

    • 从概念上讲,这等效于在*.psm1中创建和引用根RootModule脚本,并且-而不是定义NestedModules条目-明确将{{1 }}来自那里的脚本-见底部。

    • 请注意,如果您要引用*.ps1中的*.psm1个文件,它们将真正成为具有各自作用域的嵌套模块;嵌套模块可从封闭模块中使用,但对外界不可见(尽管您可以使用NestedModules在已加载的模块中列出)。


列出Get-Module -All中的*.ps1文件与从NesteModules进行点源采购

虽然功能上应该没有差异,但是使用RootModule *.psm1来点源包含模块功能的RootModule文件可以潜在地简化事情,如果,您只需要点源位于模块目录的子树中的所有 *.ps1文件:

*.ps1

如果您需要按特定顺序加载脚本,只需要脚本的一个子集,或者想要稍微加快速度(尽管我怀疑速度差异会很明显),则可以点源文件分别从# Add this to the *.psm1 file specified in 'RootModule' # Find all *.ps1 files in the module's subtree and dot-source them foreach ($script in (Get-ChildItem -File -Recurse -LiteralPath $PSScriptRoot -Filter *.ps1) ) { . $script } RootModule文件中提取,以代替在*.psm1条目中列出它们:

NestedModules
同样,以上所有方法在功能上都是等效的。 假定您通过# Add this to the *.psm1 file specified in 'RootModule' # Dot-source the *.ps1 files individually. . "$PSScriptRoot/db/Backup-Database.ps1" # ... . "$PSScriptRoot/vsts/work/Get-WorkItems.ps1" 条目显式导出函数(建议),必须使用点源的ExportedFunctions文件的使用最终是与命令发现目的无关的实现细节。和模块自动加载-仅在实际导入时才重要。

答案 1 :(得分:0)

.psm1文件是powershellmodule文件。创建脚本模块时,我们将模块的所有功能写入.psm1文件中,然后导出功能,然后可以通过导入模块来使用这些功能。 .psm1基本上是指powershellmodule。 Powershell会直接识别此文件中写入的所有内容,这些内容将成为模块的一部分。