4

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

DefaultCommandPrefix = 'MyToolbox'

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

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

4

2 回答 2

1

好的,这有点烦人,但它有效。您可以使用不带参数的 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 中填充您希望用户可以访问的函数列表。

于 2018-10-15T20:27:27.963 回答
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

关于要求

于 2019-07-11T06:50:48.017 回答