【问题标题】:Unable To Load PowerShell Module无法加载 PowerShell 模块
【发布时间】:2017-09-22 17:25:48
【问题描述】:

我创建了一个 *.psm1 和 *.psd1 文件。驻留在与文件同名的目录(文件夹)中。这个目录在c:\Program Files\WindowsPowerShell\Modules\...

Import-module 没有报告错误,Get-Module 显示之后的模块。 Test-ModuleManifest 返回正确的清单。但是,PowerShell 无法识别 cmdlet 本身。还要注意的是Test-ModuleManifest 没有显示任何导出的命令(这正常吗?)。

文件安全性很好,当我将 *.psm1 放入 Autoload 文件夹时,它可以按预期工作。

检查了常见的错误和错误以及广泛的谷歌搜索。 PS Gallery 中的几个模块已成功导入。这家店里没有人能够弄清楚缺少什么。

此故障发生在几个不同的平台上,所有 Windows(7 或 10)都具有 AMD 和 Intel 内核。

有人遇到过这个问题吗?你能解决这个问题吗?

这是我的 ModuleManifest,使用 New-ModuleManifest 生成并使用 ISE 修改。

# 模块“Convert-F2C”的模块清单 # # 生成者:我 # # 生成于:2017 年 4 月 25 日 # @{ # 与此清单关联的脚本模块或二进制模块文件。 # 根模块 = '' # 该模块的版本号。 模块版本 = '1.0' # 支持的 PS 版本 # 兼容PSEditions = @() # 用于唯一标识此模块的 ID GUID = '252b9222-9bc8-4634-b658-dd234b483152' # 这个模块的作者 作者 = '我' # 该模块的公司或供应商 CompanyName = '我的公司' # 此模块的版权声明 版权所有 = '(c) 2017 我。版权所有。' # 本模块提供的功能说明 说明 = '将华氏温度转换为摄氏温度' # 此模块所需的 Windows PowerShell 引擎的最低版本 # PowerShell版本 = '' # 此模块所需的 Windows PowerShell 主机的名称 # PowerShellHostName = '' # 此模块所需的 Windows PowerShell 主机的最低版本 # PowerShellHostVersion = '' # 此模块所需的 Microsoft .NET Framework 的最低版本。这 先决条件仅对 PowerShell 桌面版有效。 # DotNetFrameworkVersion = '' # 此所需的公共语言运行时 (CLR) 的最低版本 模块。此先决条件仅对 PowerShell 桌面版有效。 # CLRVersion = '' # 此模块所需的处理器架构(无,X86,Amd64) # 处理器架构 = '' # 必须先导入全局环境的模块 导入此模块 # 必需模块 = @() # 在导入此模块之前必须加载的程序集 # 必需组件 = @() # 之前在调用者环境中运行的脚本文件 (.ps1) 导入此模块。 # ScriptsToProcess = @() # 导入此模块时要加载的类型文件(.ps1xml) # TypesToProcess = @() # 导入此模块时要加载的格式文件(.ps1xml) # FormatsToProcess = @() # 模块作为指定模块的嵌套模块导入 RootModule/ModuleToProcess # 嵌套模块 = @() # 从此模块导出的函数,为获得最佳性能,请勿使用 通配符并且不删除条目,如果没有则使用空数组 导出的功能。 FunctionsToExport = '转换-F2C' # 要从此模块导出的 Cmdlet,为了获得最佳性能,请勿使用 通配符并且不删除条目,如果没有则使用空数组 要导出的 cmdlet。 CmdletsToExport = @() # 要从此模块导出的变量 变量导出 = @() # 从此模块导出的别名,为获得最佳性能,请勿使用 通配符并且不删除条目,如果没有则使用空数组 要导出的别名。 AliasesToExport = '*' # 要从此模块导出的 DSC 资源 # DscResourcesToExport = @() # 与该模块打包的所有模块列表 # ModuleList = @(Convert-F2c.psm1) # 该模块打包的所有文件列表 # 文件列表 = @() # 传递给指定模块的私有数据 RootModule/ModuleToProcess。这也可能包含一个 PSData 哈希表 PowerShell 使用的其他模块元数据。 私人数据 = @{ PSData = @{ # 应用于此模块的标签。这些有助于模块发现 在线画廊。 # 标签 = @() # 此模块的许可证的 URL。 # LicenseUri = '' # 此项目主网站的 URL。 # ProjectUri = '' # 代表此模块的图标的 URL。 # IconUri = '' # 该模块的发布说明 ReleaseNotes = '初始创建,第一个体现的模块由 作者' } # PSData 哈希表结束 } # PrivateData 哈希表结束 # 此模块的 HelpInfo URI # 帮助信息URI = '' # 从该模块导出的命令的默认前缀。覆盖 使用 Import-Module -Prefix 的默认前缀。 # 默认命令前缀 = '' }

【问题讨论】:

  • 创建一个只有一个简单函数的示例模块。确保它按预期工作。然后,您可以在不起作用的模块中识别您的错误。
  • 为我们提供一个最小的可重现示例。
  • 第一个注意事项:如果 *.psd1 不在它所在的文件夹中,*.psm1 可以正常工作。
  • 在您的清单中,检查FunctionsToExport,我通常使用FunctionsToExport = '*' 将它们全部导出,并且NestedModules 列出了模块文件的名称(psm1)
  • 无法在 PS v2.0 环境中修复它 ($psversiontable.psversion) 尝试使用以下解决方案下载一些模块,因此现在尝试升级到 v5.1。

标签: powershell module


【解决方案1】:

如果你的模块有这些文件:

  • MyModule.psd1
  • MyModule.psm1
  • ExtraModule.psm1

你需要更新这一行:

# NestedModules = @()

到这里:

NestedModules = @('MyModule','ExtraModule')

并确保您的FunctionsToExport 列出所有函数,或者您可以使用FunctionsToExport = '*' 将它们全部导出。

【讨论】:

  • 我投了赞成票,因为这很容易成为开发 PowerShell 模块中最令人困惑的方面之一
【解决方案2】:

我通过设置 RootModule 参数让它工作。在任何文献或参考资料中都没有这样做,但该模块现在可以正常运行。

# Script module or binary module file associated with this manifest.
  RootModule = 'ModuleName (no extension)'

【讨论】:

  • 为我删除扩展将模块类型从 Script 更改为 ManifestExportedCommands 仍然为空,直到我运行 Get-Module -Name XImport-Module -Name X 这似乎强制更新命令/模块缓存文件ModuleAnalysisCache.
【解决方案3】:

在清单文件的 RootModule 参数中指定完整路径(最高为“.psm1”)并不能解决问题,因为 ExportedCommands 属性仍然为空。

运行Import-Module MyFirstModule -Verbose 表示它正在从路径“.psd1”而不是“.psm1”加载模块。

运行Import-Module 以“.psm1”结尾的完整路径正确加载了模块(即模块函数出现在ExportedCommands 中),但在这种情况下,当您运行Get-Module 时,ModuleType 是脚本,不是清单。所以我想当清单文件位于模块目录中并且无法正确识别时,似乎会出现问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    相关资源
    最近更新 更多