2015-05-25 41 views
1

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

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

当它们不是(所有它们)在.psm1文件中时,它甚至可以从模块中导出函数吗?我仍然试图找出真正的差异,并使用* psd1和* psm1文件。

+0

什么是“powershell项目”?你的意思是一些特定的文件类型或只是一个你一直在处理的抽象项目? –

+0

抽象的项目。在这种情况下,PowerShell项目=一组函数。 –

回答

3

是的,您可以将一堆.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可以通过例如[guid]::NewGuid()生成。

+0

令人惊叹的答案。谢谢。对我来说缺少链接是ModuleToProcess ='MyModule.psm1'。默认* psd1文件不包含它。我试图从这个文件中点源文件,但显然,它从来没有被调用过。 –

1

这里做一个非常简单的方法,没有包括通过点采购模式的功能,因为它在其他答案的完成:

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

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

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

,该用户可以在任何PowerShell会话包括你的模块任何功能的第一个字母(S)型,即PowerShell的智能感知将认识到从你的模块功能(和uggest完成子)。

如果你不喜欢这个名字MyModule的,你可以改变它,只要你更改文件夹的名称,以及该PSM1文件名。

您也可以选择安装您的模块全部用户:help about_modules。

+4

这实际上是我想避免的。将所有功能放到单个文件中对我来说是不可接受的。对这样的文件和代码进行代码评论真的很难。除此之外,我想在我的函数中保留特定的目录结构。我来自java世界,我倾向于保留它们所属的'包'或目录中的函数。core/utils/network等。 –

+0

那么,你决定什么对你更好。我告诉你如何以一种非常简单的方式实现你所要求的**。该模块就是一个模块,以及它的内容是如何排序的,不会引起任何人的兴趣。在你身边,你的代码将以你喜欢的方式导致该模块,按你喜欢的方式排列。使用它们作为源代码,你可以建立一个模块,这个模块如何包含代码对任何人都无关紧要,甚至可以改变你对源代码的定义(当然,它们是与模块分开的)。我告诉过你如何以一种非常简单的方式建立一个模块**。 –

+0

那么,如果包含所有函数,目前在单独的文件中,则单个* .psm1文件实际上几乎影响它们的顺序:-)。从一般的观点来看,你的回答是正确的,但是它不回答我原来的问题。从原来的问题:“当它们不是(全部)在.psm1文件中时,它甚至可以从模块中导出函数?”。对不起,如果我的评论以任何方式给你。为此我表示歉意。我仍然非常感谢你的回答,谢谢。 –

相关问题