如何将一组脚本文件变成一个模块?
How do I turn a collection of script files into a module?
你们知道吗,是否可以将仅由函数组成的 PowerShell 项目转换为模块?我想要实现的是创建我所有功能的可分发模块,以便其他人可以使用它。但无需花费时间将所有功能转换为 cmdlet。
我的每个函数都在单独的文件中。当我创建 *.psd1 并尝试通过 'FunctionsToExport' 包含函数时,它不起作用。加载模块后我看不到我的功能。
当模块(全部)不在 .psm1 文件中时,甚至可以从模块中导出函数吗?我仍在尝试找出 *psd1 和 *psm1 文件的真正区别和使用。
是的,您可以将一堆 .ps1
文件变成一个模块。在模块目录 $env:USERPROFILE\Documents\WindowsPowerShell\Modules
中创建一个新文件夹,并将所有 .ps1
文件放入该文件夹中。同时在文件夹中创建两个文本文件 <foldername>.psm1
和 <foldername>.psd1
,这样你就有了这样的结构:
$env:USERPROFILE
`-文件
`-WindowsPowerShell
`-模块
<b>`-MyModule
+-MyModule.psd1
+-MyModule.psm1
+-script1.ps1
+-script2.ps1
:
`-scriptN.ps1</b>
将以下行放在 .psm1
文件中,这样 "imports" 所有 .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
这是一个非常简单的方法,没有通过点源模式包括你的函数,就像在另一个答案中所做的那样:
- 创建文件夹
C:\MyModules
。
- 在此文件夹中,创建一个名为 MyModules.PSM1.
的 空 文件
- 附加到 MyModules.PSM1 文件,模块中需要的所有函数(它们不需要高级)。
- 大功告成.
现在,您有一个文件夹 ( C:\MyModules
),您 必须 在目标机器上安装它。
要将它安装在目标机器上(每个用户),将文件夹 C:\MyModule
复制到用户的默认模块位置(即文件夹):$home\Documents\WindowsPowerShell\Modules
.
现在,此用户可以在任何 PowerShell 会话中输入 模块中包含的任何函数的首字母,即PowerShell 的 IntelliSense 将识别您模块中的函数(并建议完成子字符串)。
如果不喜欢MyModule这个名字,可以改,只要把文件夹名和PSM1文件名.
您还可以选择为 所有 用户安装您的模块:帮助 about_modules.
你们知道吗,是否可以将仅由函数组成的 PowerShell 项目转换为模块?我想要实现的是创建我所有功能的可分发模块,以便其他人可以使用它。但无需花费时间将所有功能转换为 cmdlet。
我的每个函数都在单独的文件中。当我创建 *.psd1 并尝试通过 'FunctionsToExport' 包含函数时,它不起作用。加载模块后我看不到我的功能。
当模块(全部)不在 .psm1 文件中时,甚至可以从模块中导出函数吗?我仍在尝试找出 *psd1 和 *psm1 文件的真正区别和使用。
是的,您可以将一堆 .ps1
文件变成一个模块。在模块目录 $env:USERPROFILE\Documents\WindowsPowerShell\Modules
中创建一个新文件夹,并将所有 .ps1
文件放入该文件夹中。同时在文件夹中创建两个文本文件 <foldername>.psm1
和 <foldername>.psd1
,这样你就有了这样的结构:
$env:USERPROFILE
`-文件
`-WindowsPowerShell
`-模块
<b>`-MyModule
+-MyModule.psd1
+-MyModule.psm1
+-script1.ps1
+-script2.ps1
:
`-scriptN.ps1</b>
将以下行放在 .psm1
文件中,这样 "imports" 所有 .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()
.
这是一个非常简单的方法,没有通过点源模式包括你的函数,就像在另一个答案中所做的那样:
- 创建文件夹
C:\MyModules
。 - 在此文件夹中,创建一个名为 MyModules.PSM1. 的 空 文件
- 附加到 MyModules.PSM1 文件,模块中需要的所有函数(它们不需要高级)。
- 大功告成.
现在,您有一个文件夹 ( C:\MyModules
),您 必须 在目标机器上安装它。
要将它安装在目标机器上(每个用户),将文件夹 C:\MyModule
复制到用户的默认模块位置(即文件夹):$home\Documents\WindowsPowerShell\Modules
.
现在,此用户可以在任何 PowerShell 会话中输入 模块中包含的任何函数的首字母,即PowerShell 的 IntelliSense 将识别您模块中的函数(并建议完成子字符串)。
如果不喜欢MyModule这个名字,可以改,只要把文件夹名和PSM1文件名.
您还可以选择为 所有 用户安装您的模块:帮助 about_modules.