9

当我使用

Import-Module -Name <path_to_local_dll> -Verbose

不会导出 DLL 文件中包含的 cmdlet。

因此,当我键入Get-Module我的导入模块时,会列出,但没有任何 ExportedCommands。为什么?

ModuleType Name                      ExportedCommands
---------- ----                      ----------------
Binary     MyModule

在具有相同软件(PowerShell、.NET Framework,...)的第二台 PC 上,相同的导入 DLL 文件可以正常工作。在那里我得到了 ExportedCommands。

这种行为取决于什么?

不幸的是,该Import-Modulecmdlet 没有表明它无法导入 cmdlet。有没有办法得到它为什么失败的迹象?

4

4 回答 4

11

两件事情:

  1. 确保您使用的是模块清单文件(.psd1 文件)。更多信息可以在如何编写模块清单中找到

  2. 最重要的是,编辑您的清单文件并确保它引用您的根模块,如下所示:

    RootModule = '你的模块名称'

我刚刚完成了几个小时的战斗,我无法弄清楚我的其他模块中缺少什么。这确实成功了!

于 2018-01-25T20:41:03.207 回答
1

另一个要求:确保 cmdlet 类是public。例如,在我最初的 .cs 文件中

[Cmdlet(VerbsCommon.Get, "Proc")]
class GetProcCommand : Cmdlet
{ ...

即使在添加了带有RootModulesetGet-Module的清单文件ExportedCommands后,我的Import-Module. 为了修复它,我只是将该类标记为公共并重建了我的 .dll 程序集:

[Cmdlet(VerbsCommon.Get, "Proc")]
public class GetProcCommand : Cmdlet
{ ...

我在使用ildasm检查我的 .dll 时发现了这一点——我注意到我的一些类是公共的,但我的 cmdlet 类是私有的。

于 2019-03-22T17:15:38.617 回答
0

可能是 psd1 文件(模块清单)不包含命令。

这个页面有一个关于如何创建模块清单的教程。

于 2016-12-16T04:07:00.323 回答
0

从 PowerShell 模块显式导出函数对我有用:

function New-CmdLetNameHere
{
    ...
}
Export-ModuleMember -Function New-CmdLetNameHere
于 2017-08-14T06:05:56.523 回答