【问题标题】:How to make sure PowerShell module manifest (.psd1) is used如何确保使用 PowerShell 模块清单 (.psd1)
【发布时间】:2018-02-25 03:16:10
【问题描述】:

我为它创建了一个 PowerShell 模块 MyUtil.psm1 和一个清单文件 MyUtil.psd1。在 psd1 文件中,它定义了前缀以防止导出函数的名称冲突:

DefaultCommandPrefix = 'MyToolbox'

这样,运行Import-Module .\MyUtil.psd1后,psm1文件中Get-Command之类的函数就会变成Get-MyToolboxCommand,一切正常。但是如果有人运行Import-Module .\MyUtil.psm1直接导入psm1文件,psd1文件根本就不用,我想要的前缀也不会应用。

如果我想阻止这种情况(直接导入 MyUtil.psm1),有没有办法允许导入相应的 psd1 清单文件而不是 psm1 文件?或者以编程方式检测此模块不是通过 psd1 导入的,因此我可以警告用户使用 psd1?

【问题讨论】:

  • @wp78de 谢谢!请在您的帖子中查看我的评论。我还在帖子里加了几句,希望能让我的问题更清楚。
  • 我不这么认为。没见过这个。

标签: powershell powershell-module import-module


【解决方案1】:

好的,这有点烦人,但它确实有效。您可以使用不带 args 的 Export-ModuleMember cmdlet 来阻止 psm1 导出任何内容,但您需要在导入期间将值从 psd1 发送到 psm1。这样我们就知道什么时候被 psd1 调用了。所以首先,在你的 PSD 中为 PrivateData 哈希表添加一个值:

    PrivateData = @{
    FromPSD = $true       
    PSData = @{

然后你需要在psm1文件中访问它。您可以在函数中,但不能内联,因此我们必须将其粘贴到函数中。

function Get-PD
{
    [CmdletBinding()]
    $MyInvocation.MyCommand.Module.PrivateData
}

(我完全从这个 SO 答案 Accessing PrivateData during Import-Module 偷了这个)。

然后您通过在模块中调用此代码将其全部包装起来,该代码将在模块加载时运行。

$MyPD = Get-PD
if($MyPD.Count -eq 0)
{
    Export-ModuleMember
}

现在,如果您不希望在加载模块时引用这个讨厌的额外函数,则需要在 psd1 文件中的 FunctionsToExport 中填充您希望用户可以访问的函数列表。

【讨论】:

    【解决方案2】:

    您可以使用:#Requires

    例如:

    要求安装 Hyper-V(1.1 或更高版本)。

    #Requires -Modules @{ ModuleName="Hyper-V"; ModuleVersion="1.1" }
    

    需要安装 Hyper-V(仅 1.1 版)。

    #Requires -Modules @{ ModuleName="Hyper-V"; RequiredVersion="1.1" }
    

    要求安装任何版本的 PSScheduledJob 和 PSWorkflow。

    #Requires -Modules PSWorkflow, PSScheduledJob
    

    About Requires

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多