当我使用
时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-Module
cmdlet没有表明它无法导入cmdlet。有没有办法得到它失败的原因?
答案 0 :(得分:5)
两件事:
确保您使用的是模块清单文件(.psd1文件)。可以在 How to Write a Module Manifest
最重要的是,编辑清单文件并确保它引用您的根模块,如下所示:
RootModule =&#39;您模块的名称&#39;
我刚刚完成了几个小时的战斗,我无法弄清楚我的其他模块中缺少了什么。这肯定是诀窍!
答案 1 :(得分:1)
可能是psd1文件(模块清单)不包含命令。
This page has a tutorial关于如何创建模块清单。
答案 2 :(得分:0)
从PowerShell模块中明确导出函数对我有用:
function New-CmdLetNameHere
{
...
}
Export-ModuleMember -Function New-CmdLetNameHere
答案 3 :(得分:0)
另一个要求:确保cmdlet类是 public 。对于example,我的.cs文件最初有:
[Cmdlet(VerbsCommon.Get, "Proc")]
class GetProcCommand : Cmdlet
{ ...
即使添加了设置了RootModule
的清单文件之后,Get-Module
仍然没有显示ExportedCommands
之后的Import-Module
。为了解决这个问题,我只是将该类标记为public并重建了我的.dll程序集:
[Cmdlet(VerbsCommon.Get, "Proc")]
public class GetProcCommand : Cmdlet
{ ...
我在使用ildasm检查.dll时发现了这一点-我注意到我的某些类是公共的,但我的cmdlet类是私有的。
答案 4 :(得分:-2)
这对我有用:
以管理员权限运行PowerShell。
现在运行命令Set-ExecutionPolicy Restricted
现在试试这个:
Import-Module -Name YourModuleName
Get-Command -Module YourModuleName