如何确保使用PowerShell模块清单(.psd1)

时间:2017-09-15 21:47:48

标签: powershell powershell-module import-module

我为它创建了一个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),有没有办法 ONLY 允许导入相应的psd1清单文件而不是psm1文件?或者以编程方式检测此模块未通过psd1导入,以便我可以警告用户使用psd1?

2 个答案:

答案 0 :(得分:0)

好的,这有点烦人,但是可以。您可以使用不带参数的Export-ModuleMember cmdlet来阻止psm1导出任何内容,但是在导入过程中需要将psd1中的值发送到psm1。这样我们就知道何时被psd1调用。因此,首先,在PSD中的PrivateData哈希表中添加一个值:

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

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

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

(我完全是从这个Accessing PrivateData during Import-Module答案中偷走的)。

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

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

现在,如果您不希望在加载模块时引用此讨厌的额外功能,则需要在psd1文件中的“ FunctionsToExport”中填充希望用户访问的功能列表。

答案 1 :(得分:0)

您可以使用:#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