【问题标题】:How do I turn a collection of script files into a module?如何将脚本文件集合转换为模块?
【发布时间】:2015-05-25 20:38:33
【问题描述】:

你们知道,是否可以将仅由函数组成的 PowerShell 项目转换为模块?我想要实现的是创建我所有功能的可分发模块,以便其他人可以使用它。但无需花费时间将所有功能转换为 cmdlet。

我的每个函数都在单独的文件中。然后,当我创建 *.psd1 并尝试通过“FunctionsToExport”包含函数时,它不起作用。加载模块后我看不到我的功能。

当它们不是(全部)在 .psm1 文件中时,甚至可以从模块中导出函数吗?我仍在尝试找出 *psd1 和 *psm1 文件的真正区别和用途。

【问题讨论】:

  • 什么是“powershell 项目”?您是指某个特定的文件类型,还是只是您一直在从事的抽象项目?
  • 抽象项目。在这种情况下,PowerShell 项目 = 函数集。

标签: powershell powershell-module


【解决方案1】:

是的,您可以将一堆.ps1 文件变成一个模块。在您的模块目录$env:USERPROFILE\Documents\WindowsPowerShell\Modules 中创建一个新文件夹,并将所有.ps1 文件放入该文件夹中。还要在文件夹中创建两个文本文件<foldername>.psm1<foldername>.psd1,这样你就有了这样的结构:

$env:USERPROFILE
`-Documents
  `-WindowsPowerShell
    `-Modules
      `-MyModule
        +-MyModule.psd1
        +-MyModule.psm1
        +-script1.ps1
        +-script2.ps1
        :
        `-scriptN.ps1

将以下行放入.psm1 文件中,以便它“导入”所有.ps1 文件:

Get-ChildItem -Path "$PSScriptRoot\*.ps1" | % { . $_.FullName }

并在module manifest.psd1 文件)中指定您的元数据,例如:

@{
  ModuleToProcess   = 'MyModule.psm1'
  ModuleVersion     = '1.0'
  GUID              = '6bc2ac1e-2e88-4bc3-ac84-ecd16739b6aa'
  Author            = 'Matthew Lowe'
  CompanyName       = '...'
  Copyright         = '...'
  Description       = 'Description of your module.'
  PowerShellVersion = '2.0'

  FunctionsToExport = '*'
  CmdletsToExport   = ''
  VariablesToExport = ''
  AliasesToExport   = ''
}

可以通过 [guid]::NewGuid() 生成 GUID。

【讨论】:

  • 惊人的答案。谢谢你。对我来说缺少的链接是行 ModuleToProcess = 'MyModule.psm1'。默认 *psd1 文件不包含它。我试图从这个文件中点源函数文件,但显然它从未被调用过。
  • 您可以通过将名称添加到 CmdletsToExport 来限制导出的 cmdlet。我写了几个助手 cmdlet,我不想污染会话。
  • @hsimah 就我个人而言,我会使用“官方”名称(Get-FooSelect-Something,...)作为我要导出的函数/cmdlet,名称不带连字符(FooHelper , ...) 对于我不想导出的辅助函数,然后通过 FunctionsToExport = "*-*" 仅导出前者。
【解决方案2】:

这是一种非常简单的方法,没有通过点源模式包含您的功能,就像在另一个答案中所做的那样:

  1. 创建文件夹C:\MyModules
  2. 在此文件夹中,创建一个名为 MyModules.PSM1empty 文件。
  3. 附加到 MyModules.PSM1 文件,模块中需要的所有功能(不需要高级)。
  4. 你已经完成了

现在,您有一个文件夹 (C:\MyModules),您必须将其安装在目标计算机上。

要将其安装到目标机器(每个用户),请将文件夹 C:\MyModule 复制到用户的默认模块位置(即文件夹):$home\Documents\WindowsPowerShell\Modules

现在,该用户可以在任何 PowerShell 会话中键入您的模块中包含的任何函数的首字母,这样 PowerShell 的 IntelliSense 就会从您的模块(并建议完成子字符串)。

如果您不喜欢 MyModule 这个名称,可以更改它,只要更改文件夹名称以及 PSM1 文件名即可。 p>

您还可以选择为所有用户安装您的模块:help about_modules。

【讨论】:

  • 这实际上是我想避免的。将所有功能放入单个文件对我来说是不可接受的。对这样的文件进行代码审查真的很困难。除此之外,我想在我的函数中保留一定的目录结构。我来自 java 世界,我倾向于将函数保存在它们所属的“包”或目录中 ..core/utils/network 等。
  • 好吧,你决定什么对你更好。我告诉过你如何实现你所要求的,以一种非常简单的方式。模块只是一个模块,它的内容是如何排序的,任何人都不感兴趣。在您身边,您拥有的代码将以 YOU 喜欢的方式生成该模块,并按照您喜欢的方式排列。使用它们作为源代码,你构建了一个模块,这个模块如何包含代码并不重要,它甚至会改变你订购源代码的方式(当然,它们与模块是分开的)。我告诉过你如何以非常简单的方式构建模块
  • 好吧,如果将当前位于单独文件中的所有函数包含到单个 *.psm1 文件中,实际上会影响它们的顺序:-)。从一般的角度来看,您的回答是正确的,但是它没有回答我原来的问题。从最初的问题:“当它们不是(全部)在 .psm1 文件中时,甚至可以从模块中导出函数吗?”。对不起,如果我的评论以任何方式冒犯了你。为此我深表歉意。我仍然非常感谢您的回答,谢谢。
  • 我没有被冒犯,但您将 OP 中提到的问题带入上下文。 1st) 您没有说要避免将所有文件放入单个 PSM1 文件中。 2nd) PSM1 文件中的文件顺序无关紧要除非它们有一些相互依赖。 3rd) 您没有提到要导出模块中未包含的任何功能。这当然是不可能的,因为如果一个功能不包含在一个模块中,它就不能被这个模块管理。假设您的模块中有 5 个函数(f1、f2、f3、f4、f5)。
  • 使用我的方法,默认情况下会导出所有 5 个。如果您不想导出某些函数,可以使用 export 指令选择要导出的 all 函数。如果您需要更多说明,请告诉我。
猜你喜欢
  • 2021-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-19
  • 2011-04-19
  • 1970-01-01
相关资源
最近更新 更多