我有一个带有.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'
}
}
答案 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。