【问题标题】:Powershell import-module doesn't find modulesPowershell import-module 找不到模块
【发布时间】:2011-09-18 18:25:05
【问题描述】:

我正在学习 PowerShell,并且正在尝试构建自己的模块库。

我编写了一个简单的模块XMLHelpers.psm1 并放入我的文件夹$home/WindowsPowerShell/Modules

当我这样做时:

 import-module full_path_to_XMLHelpers.psm1

它有效。但是当我这样做时:

import-module XMLHelpers

它不起作用,我收到错误:

Import-Module : 未加载指定的模块“xmlhelpers”,因为在任何模块目录中都找不到有效的模块文件。

我已检查环境变量 PSModulePath 是否包含此文件夹。由于它是一个网络文件夹,我也尝试将其移动到本地文件夹并修改PSModulePath,但没有成功

 $env:PSModulePath=$env:PSModulePath+";"+'C:\local'

你知道什么可能导致这个问题吗?

【问题讨论】:

标签: powershell module


【解决方案1】:

模块需要放在与模块同名的文件夹中。在你的情况下:

$home/WindowsPowerShell/Modules/XMLHelpers/

完整路径是:

$home/WindowsPowerShell/Modules/XMLHelpers/XMLHelpers.psm1

然后你就可以做到:

import-module XMLHelpers

【讨论】:

  • 谢谢它确实有效。我是否需要每个模块都遵循规则 module_name/module_name.psm1 ?
  • @Serge:是的,每个单独的模块都是这样的。
  • 是的,除非您在 Import-Module 语句中使用完整路径。您还可以将函数组织到多个 .psm1 文件中,并通过模块清单文件 (.psd1) 加载它们。在这种情况下,.psd1 和多个 .psm1 文件将位于同一个“module_name/”目录下。只有 .psd1 文件需要与模块同名。
  • 您也可以使用:import-module .\XMLHelpers.psm1
  • 这可以在文档中更清楚地说明。文件夹结构是我缺少的部分。
【解决方案2】:

1.这将在当前文件夹中搜索 XMLHelpers/XMLHelpers.psm1

Import-Module (Resolve-Path('XMLHelpers'))

2.这将在当前文件夹中搜索 XMLHelpers.psm1

Import-Module (Resolve-Path('XMLHelpers.psm1'))

【讨论】:

  • 非常适合开发和调试模块
【解决方案3】:

我认为Import-Module 正在尝试在默认目录C:\Windows\System32\WindowsPowerShell\v1.0\Modules 中查找模块。

尝试放完整路径,或者复制到C:\Windows\System32\WindowsPowerShell\v1.0\Modules

【讨论】:

  • 这只是它看起来的一个位置。还有其他的。见$env:PSModulePath
【解决方案4】:

在成功之前,我遇到了同样的错误并尝试了很多东西。解决方案是将脚本的路径添加到模块的相对路径中,如下所示:

// Note that .Path will only be available during script-execution
$ScriptPath = Split-Path $MyInvocation.MyCommand.Path

Import-Module $ScriptPath\Modules\Builder.psm1

顺便说一句,您应该看看http://msdn.microsoft.com/en-us/library/dd878284(v=vs.85).aspx,其中指出:

从 Windows PowerShell 3.0 开始,当在命令中使用模块中的任何 cmdlet 或函数时,会自动导入模块。此功能适用于包含在 PSModulePath 环境变量 ($env:PSModulePath) 值中的目录中的任何模块

【讨论】:

  • 这只有在 Modules 目录恰好与脚本位于同一位置时才有效。
【解决方案5】:

我遇到了这个问题,但只是在 Visual Studio Code 中,而不是在 ISE 中。原来我在 VSCode 中使用了 x86 会话。我显示了 PowerShell 会话菜单并切换到 x64 会话,所有模块都开始工作而没有完整路径。我正在使用版本 1.17.2,VSCode 的 x64 架构。我的模块存储在 C:\Windows\System32\WindowsPowerShell\v1.0\Modules 目录中。

【讨论】:

    【解决方案6】:

    有些插件需要一个以Administrator 运行,并且除非在shell 中有这些凭据处于活动状态,否则它们不会加载。

    【讨论】:

      【解决方案7】:

      我在 Windows 7 上使用 PS 5.0 的发现:$ENV:PsModulePath 必须以 .这通常意味着它将加载该路径中的所有模块。

      我无法将单个模块添加到 $env:PsModulePath 并使用 Import-Module ExampleModule 加载它。我必须使用模块的完整路径。例如C:\MyModules\ExampleModule。我确信它曾经工作过。

      例如: 假设我有模块:

      C:\MyModules\ExampleModule
      C:\MyModules\FishingModule
      

      我需要将C:\MyModules\ 添加到$env:PsModulePath,这样我就可以这样做了

      Import-Module ExampleModule
      Import-Module FishingModule
      

      如果出于某种原因,我不想要FishingModule,我想我可以只添加C:\MyModules\ExampleModule(没有尾随\),但现在这似乎不起作用。要加载它,我必须Import-Module C:\MyModules\ExampleModule

      有趣的是,在这两种情况下,Get-Module -ListAvailable 都会显示模块,但不会导入。虽然,模块的 cmdlet 似乎仍然可以工作。

      AFAIK,要使自动导入工作,必须将函数的名称添加到清单 (.psd1) 文件中的 FunctionsToExport。添加FunctionsToExport = '*',会中断自动加载。您仍然可以在模块文件 (.psm1) 中包含 Export-ModuleMember -Function *

      这些是我的发现。是否有变化或我的电脑坏了,还有待观察。高温

      【讨论】:

        【解决方案8】:

        在 powershell 上尝试以下操作:

        Set-ExecutionPolicy -ExecutionPolicy Unrestricted
        import-module [\path\]XMLHelpers.psm1
        

        而不是 [] 放完整路径

        thisthat的完整解释

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-10-21
          • 1970-01-01
          • 2020-09-19
          • 2021-12-03
          • 1970-01-01
          • 1970-01-01
          • 2021-01-14
          • 1970-01-01
          相关资源
          最近更新 更多