PowerShell: Import-Module, but no “ExportedCommands” available

老子叫甜甜 提交于 2019-12-21 02:00:55

问题


When I use

Import-Module -Name <path_to_local_dll> -Verbose

the cmdlets contained in the DLL file are not exported.

Thus, when I type Get-Module my imported module is listed, but without any ExportedCommands. Why?

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

On a second PC with the same software (PowerShell, .NET Framework, ...), the same imported DLL file works fine. There I get ExportedCommands.

On what can this behaviour depend?

Unfortunately, the Import-Module cmdlet gives no indication that it failed to import the cmdlets. Is there a way to get an indication why it fails?


回答1:


Two things:

  1. Make sure you're using a module manifest file (.psd1 file). More information can be found in How to Write a Module Manifest

  2. Most importantly, edit your manifest file and make sure it references your root module as follows:

    RootModule = 'name of your module'

I just finished fighting with this for a few hours and I couldn't figure out what I was missing from my other modules. This did the trick for sure!




回答2:


It may be that the psd1 file (the module manifest) does not contain the commands.

This page has a tutorial on how to create a module manifest.




回答3:


One other requirement: ensure that the cmdlet class is public. For example, in my .cs file I initially had:

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

Even after adding a manifest file with RootModule set, Get-Module continued to show no ExportedCommands after my Import-Module. To fix it I just marked the class as public and rebuilt my .dll assembly:

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

I figured this out while examining my .dll using ildasm - I noticed that some of my classes were public, but my cmdlet class was private.




回答4:


Explicitly exporting function from the PowerShell module worked for me:

function New-CmdLetNameHere
{
    ...
}
Export-ModuleMember -Function New-CmdLetNameHere



回答5:


This is what worked for me:

  1. Run PowerShell with Administrator privileges.

  2. Now run the command Set-ExecutionPolicy Restricted

  3. Now try this:

    Import-Module -Name YourModuleName
    
    Get-Command -Module YourModuleName
    


来源:https://stackoverflow.com/questions/33082339/powershell-import-module-but-no-exportedcommands-available

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!