为什么不是';我的PowerShell模块无法正确导出成员,为什么';导出嵌套模块不是吗?

为什么不是';我的PowerShell模块无法正确导出成员,为什么';导出嵌套模块不是吗?,powershell,deployment,module,scripting,Powershell,Deployment,Module,Scripting,我正在开发一个快速模块CLI生成器。我的想法是你有我的模块,它有添加QuickFunction、添加QuickAlias、新建QuickModule、删除QuickCommand等命令 当您构建功能时,您的模块将继续构建。计划是创建“导出QuickModule”和“导出QuickModule”命令,以便在准备导出模块时,可以将其发布到组织或公共库 因此,问题是双重的 导出的成员与模块中的命令不匹配 请注意,它仅包含2个导出的命令。这是在我将Export ModuleMember手动添加到本地系统

我正在开发一个快速模块CLI生成器。我的想法是你有我的模块,它有添加QuickFunction、添加QuickAlias、新建QuickModule、删除QuickCommand等命令

当您构建功能时,您的模块将继续构建。计划是创建“导出QuickModule”和“导出QuickModule”命令,以便在准备导出模块时,可以将其发布到组织或公共库

因此,问题是双重的

  • 导出的成员与模块中的命令不匹配
  • 请注意,它仅包含2个导出的命令。这是在我将Export ModuleMember手动添加到本地系统之后。如果没有导出模块成员,则只有新的QuickModule显示为导出

    但将其与实际的命令列表进行比较:

    PS C:\WINDOWS\system32> Get-Command -Module QuickModuleCLI
    
    CommandType     Name                                               Version    Source
    -----------     ----                                               -------    ------
    Function        Add-QuickAlias                                     0.1.3      QuickModuleCLI
    Function        Add-QuickFunction                                  0.1.3      QuickModuleCLI
    Function        ConvertTo-PowershellEncodedString                  0.1.3      QuickModuleCLI
    Function        Edit-QuickCommand                                  0.1.3      QuickModuleCLI
    Function        New-QuickModule                                    0.1.3      QuickModuleCLI
    Function        Remove-QuickCommand                                0.1.3      QuickModuleCLI
    Function        Rename-QuickCommand                                0.1.3      QuickModuleCLI
    Function        Reset-QuickCommand                                 0.1.3      QuickModuleCLI
    Function        Set-Env                                            0.1.3      QuickModuleCLI
    Function        Update-QuickModule                                 0.1.3      QuickModuleCLI
    
  • 在导入模块之前,嵌套模块不会导入到PowerShell会话中。如果有必要,我可以通过在$Profile中添加导入模块来解决这个问题,但我只想确保我没有做错任何事情
  • 这意味着,在新的会议开始后,我看到以下内容:

    PS C:\WINDOWS\system32> Write-Test
    Write-Test : The term 'Write-Test' is not recognized as the name of a cmdlet, function, script file, or operable
    program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
    At line:1 char:1
    + Write-Test
    + ~~~~~~~~~~
        + CategoryInfo          : ObjectNotFound: (Write-Test:String) [], CommandNotFoundException
        + FullyQualifiedErrorId : CommandNotFoundException
    
    PS C:\WINDOWS\system32> Import-Module QuickModuleCLI
    PS C:\WINDOWS\system32> Write-Test
    Hello
    
    我使用动态自滚动PowerShell生成器更新psd1文件并添加到函数STOEXPORT。您可以验证当我导入模块时,它是否调用嵌套的模块并正确导入它。但是,在我用来开发此模块的计算机上,我不需要导入模块,就可以在PowerShell选项中显示写测试。这是我必须“处理”的环境问题,还是你可以解决的问题

    代码可在此处找到:
    您也可以使用导入模块QuickModuleCLI自己尝试一下,第1部分-导出命令

    这里有一个关于
    ExportedCommands
    列表与
    Get Command
    的结果不匹配的问题的最小修改。我通过逐步从您的回购协议中删除代码块,直到没有任何可删除的内容,将其归结为:

    MyModule.psd1

    @{
    RootModule=“MyModule.psm1”
    ModuleVersion=“0.1.4”
    功能导出=@(
    “添加MyAlias”,
    “新MyModule”
    )
    }
    
    MyModule.psm1

    函数全局:添加MyAlias{
    写入主机“全局:添加MyAlias”
    }
    函数新MyModule{
    写入主机“新MyModule”
    }
    
    交互式

    PS>导入模块。\MyModule\MyModule.psd1-Force
    PS>获取模块MyModule
    ModuleType版本名称ExportedCommands
    ---------- -------    ----                                ----------------
    脚本0.1.4 MyModule新建MyModule
    PS>Get命令-模块MyModule
    CommandType名称版本源
    -----------     ----                                               -------    ------
    函数添加MyAlias 0.1.4 MyModule
    新功能MyModule 0.1.4 MyModule
    
    我不知道在导出函数上使用
    global:
    时的确切含义是什么(我假设函数被导入到
    global
    范围而不是模块范围),但是如果删除
    global:
    该函数将再次突然出现在
    ExportedCommands
    列表中:

    第2部分-导入模块

    PowerShell具有一项功能,可使其在一组预定义的文件夹位置中搜索未知命令。这称为“模块自动加载”,您可以根据使用
    $PSModuleAutoLoadingPreference
    变量启用或禁用该功能(提示:默认情况下已启用)

    它搜索的位置在环境变量中定义
    PSModulePath
    -请参阅


    如果希望在第一次调用时发现并自动加载模块中的命令,请将模块安装到已添加到
    PSModulePath
    环境变量的路径中,或者将模块的位置添加到路径中。

    因此,在第2部分的后续部分中,我们将找出与,事实上,这与回答中描述的行为完全相同:


    我的解决方法是将嵌套模块中的函数添加到FunctionsToExport列表中。起初,我认为我无法导出不直接属于父模块的函数。

    我无法在本地复制此函数,但tbh,我不确定我要复制的是什么。。。我尝试使用repo的副本导入模块QuickModuleCLI(没有给出错误),但是
    Get模块-Name QuickModuleCLI
    Get命令-Module QuickModuleCLI
    显示零导出命令,
    NestedModules
    在*.psd1中是一个空数组。我做得对吗?这是一个快速的模块生成器。在您创建一个模块之前,它应该没有嵌套的模块,如果您试图向一个还不存在的模块添加一个快速函数,那么它将要求为您创建一个。然后,它将在${ModuleRoot}\Modules\$QuickModule下创建一个根目录为的模块。创建该模块后,它将更改${ModuleRoot}\QuickModuleCLI文件,以便在NestedModules下添加新的$QuickModule,假设您一直都有一个特定的路径。在我的例子中,它是(分割路径$Profile)。所以我想创建一个名为“GeneralUtility”的新模块。在它里面,我想要一个新的函数openpsprofile。打开PSProfile运行“资源管理器(拆分路径$Profile)”。因此,我可以运行AddQuickFunction GeneralUtility OpenPSprofile“explorer(split path$profile)”,然后创建嵌套模块,并在嵌套模块中创建函数。当我打开另一个powershell会话时,我希望在不使用ha的情况下导出open PSProfile
    PS C:\WINDOWS\system32> Write-Test
    Write-Test : The term 'Write-Test' is not recognized as the name of a cmdlet, function, script file, or operable
    program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
    At line:1 char:1
    + Write-Test
    + ~~~~~~~~~~
        + CategoryInfo          : ObjectNotFound: (Write-Test:String) [], CommandNotFoundException
        + FullyQualifiedErrorId : CommandNotFoundException
    
    PS C:\WINDOWS\system32> Import-Module QuickModuleCLI
    PS C:\WINDOWS\system32> Write-Test
    Hello