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

时间:2016-03-03 09:55:16

标签: c# powershell

我有一个带有.psd1文件和.psm1文件的二进制PowerShell模块。 (为什么?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'
    }
}

1 个答案:

答案 0 :(得分:3)

首先,要回答您的确切问题 - 您无需担心,这是正常行为。

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.CimCmdletsAssemblyInitializer。