为什么我的 cmdlet 被导入、导出,然后再次导入

本文关键字:导入 然后 导出 我的 cmdlet 为什么 | 更新日期: 2023-09-27 18:37:07

我有一个二进制PowerShell模块,其中包含.psd1文件和.psm1文件。(为什么?Cmdlet 别名和自定义类型加速器,我一生都找不到如何在 C# 中执行这些操作。

现在,模块导入并按预期工作,但是当我在PowerShell中检查详细输入时。我看到了一些奇怪的东西:

VERBOSE: Loading module from path 'C:'path'to'module'Module.psd1'.
VERBOSE: Loading module from path 'C:'path'to'module'Module.dll'.
VERBOSE: Importing cmdlet 'Cmdlet1'.
VERBOSE: Importing cmdlet 'Cmdlet2'.
VERBOSE: Importing cmdlet 'Cmdlet3'.
VERBOSE: Importing cmdlet 'Cmdlet4'.
VERBOSE: Importing cmdlet 'Cmdlet5'.
VERBOSE: Importing cmdlet 'Cmdlet6'.
VERBOSE: Exporting cmdlet 'Cmdlet1'.
VERBOSE: Exporting cmdlet 'Cmdlet2'.
VERBOSE: Exporting cmdlet 'Cmdlet3'.
VERBOSE: Exporting cmdlet 'Cmdlet4'.
VERBOSE: Exporting cmdlet 'Cmdlet5'.
VERBOSE: Exporting cmdlet 'Cmdlet6'.
VERBOSE: Importing cmdlet 'Cmdlet1'.
VERBOSE: Importing cmdlet 'Cmdlet2'.
VERBOSE: Importing cmdlet 'Cmdlet3'.
VERBOSE: Importing cmdlet 'Cmdlet4'.
VERBOSE: Importing cmdlet 'Cmdlet5'.
VERBOSE: Importing cmdlet 'Cmdlet6'.

是什么原因造成的,我有什么可担心的吗?

PSM1 文件

$Accelerators = [PSObject].Assembly.GetType('System.Management.Automation.TypeAccelerators');
# Create accelerators for this module.
$Accelerators::Add('Obj1', 'Company.PowerShell.Module.Object1');
$Accelerators::Add('Obj2', 'Company.PowerShell.Module.Object2');
$Accelerators::Add('Obj3', 'Company.PowerShell.Module.Object3');
...
Set-Alias -Name c1 -Value Cmdlet1
Set-Alias -Name c2 -Value Cmdlet2
...

Psd1 文件

@{
    ModuleToProcess = 'Module.psm1'
    NestedModules   = 'Module.dll'
    ModuleVersion = '1.0.0.0'
    GUID = 'SOME-GUID-VALUE-HERE'
    Author = 'Me'
    CompanyName = 'Company'
    Copyright = '(c) 2016 Company. All rights reserved.'
    Description = 'Module description here.'
    PowerShellVersion = '4.0'
    DotNetFrameworkVersion = '4.5'
    CLRVersion = '4.0'
    ProcessorArchitecture = 'Amd64'
    PrivateData = @{
        Server = 'SOME'SQLSERVERINSTANCE'
        Database = 'DatabaseName'
        Domain = 'DOMAINNAME'
    }
}

为什么我的 cmdlet 被导入、导出,然后再次导入

首先,回答你的确切问题 - 你没有什么可担心的,这是正常行为。

PowerShell 可以将 dll 或 psm1 作为模块加载,因此命令会在加载时随时从这些类型的模块导出。

psd1 也是一个模块,但它本身不能定义任何命令,它依赖于在另一个模块(如 dll 或 psm1)中定义的命令。

因此,在加载模块清单 (psd1) 时,将加载根模块或嵌套模块,并导出它们导出的命令。然后,模块清单会重新导出模块清单指定的命令。请注意,此列表可以限制 dll/psm1 实际导出的内容。

现在,您正在寻找一种避免对 psm1+dll 的需求的方法。

您可以使用 Alias 属性在二进制模块中定义别名,该属性与用于定义参数别名的属性相同。此功能是在 V4 中添加的。

如果需要 V3,可以创建实现此接口的类型:https://msdn.microsoft.com/en-us/library/system.management.automation.imoduleassemblyinitializer.onimport(v=vs.85).aspx,如果您使用 Reflector,则可以在 Microsoft.Management.Infrastructure.CimCmdlets.dll,类 Microsoft.Management.Infrastructure.CimCmdlets.CimCmdlets.CimCmdletsAssemblyInitializer 中找到一个使用此方式定义别名的示例。