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