2

我有各种用 PowerShell(而不是 C#)编写的 PowerShell 模块,并且我在代码中包含文档注释,以便用户从 Get-Help 获得完整的 API 描述。

当我正在编写一个新模块时,帮助文本似乎在某个时间点卡住了;在我保存文件、重新导入模块甚至重新启动 PowerShell 然后重新导入模块之后,我对该文件中的帮助文本所做的任何后续更新都没有显示出来。

接下来我创建了一个测试模块,看看我是否可以复制这个问题。我设置了 psm1 和 psd1 文件,导入了模块,然后运行了 get-help,从 psm1 文件中看到了帮助。然后我在 psm1 文件中添加了一行文本,保存它,重新导入它……新行出现在 get-help 中!

我隐约记得前段时间读到你必须在 psd1 文件中修改版本才能识别新的帮助,但我的测试用例表明这不一定需要(而且我真的不想修改版本)。

我还隐约记得读过导入的模块缓存在某处,可以删除缓存的文件以使其识别新文本——但我不记得在哪里可以找到这些。

所以我的目标是能够在不增加模块版本的情况下,在我的真实模块中看到保存在 psm1 文件中的修改后的帮助文本。想法?

4

2 回答 2

5

在我的某些模块中重命名和更新函数时,我遇到了类似的问题。搜索了一下http://www.powertheshell.com/how-module-command-discovery-works-in-psv3/。特别是,关于过时缓存的最后一点提到

PS> Get-Module -ListAvailable -Refresh

运行解决了我的缓存问题

PS> Get-Help Get-Module -Parameter Refresh

-Refresh [<SwitchParameter>]
    Refreshes the cache of installed commands. The command cache is created when the session starts. It enables
    the Get-Command cmdlet to get commands from modules that are not imported into the session.

    This parameter is designed for development and testing scenarios in which the contents of modules have
    changed since the session started.

    When the Refresh parameter is used in a command, the ListAvailable parameter is required.
于 2013-06-28T22:41:19.997 回答
2

如果你导入一个已经导入的模块,它不会替换之前导入的函数。您需要先使用 Remove-Module 删除模块,然后再次导入。我发现在我的个人资料中有这个功能很方便:

function reload {
  param(
    [parameter(Mandatory=$true)]$Module
  )
  Write-Host;
  try {
    Remove-Module $Module -ea Stop;
  } catch {
    Write-Warning $error[0].Exception.Message;
    Write-Host;
  } finally {
    Import-Module $Module -Verbose;
  }
  Write-Host;
}
于 2013-04-29T22:16:11.763 回答