我们已经积累了一堆脚本,每个脚本都看起来像CmdLets,即它有一组声明的参数,然后它立即调用一个Main函数来完成工作,调用私有子函数。 / p>
一个例子是Remove-ContentLine.ps1
,它只是吐出文件或管道输入的内容,除了匹配某些模式的行。
所以他们喜欢小小的"功能脚本"。
有没有什么方法可以将这些脚本聚合到一个模块中,同时保持它们与文件完全一样?
修改
如果您的预感是更容易复制粘贴并将其重构为psm1
,那么只需说;)
答案 0 :(得分:1)
你问:
有什么方法可以将这些脚本聚合到模块中 还保持它们与文件完全一样吗?
但我确信不你真正想要的是什么。如果是这样,那么当您加载模块时,所有代码将立即执行!相反,我认为你想要的是你的每个脚本应该包含在一个函数中;然后在导入模块时加载该组函数;然后,您可以按需执行任何功能。
这个过程非常简单,我写了一篇关于如何做到这一点的大量文章(Further Down the Rabbit Hole: PowerShell Modules and Encapsulation),但我将在这里总结一下:
(1)编辑每个文件以将整个内容包装到函数中,并以导出函数结束。我建议根据文件名命名函数。因此,Remove-ContentLine.ps1现在应如下所示:
function Remove-ContentLine()
{
# original content of Remove-ContentLine.ps1 here
}
Export-ModuleMember Remove-ContentLine
(2)确定模块的名称并创建该名称的目录。我们称之为MyModule
。在MyModule
目录中,创建一个子目录以放置所有.ps1文件;我们称之为ScriptCmdlets
。
(3)在MyModule.psm1
内创建一个模块文件MyModule
,其内容将是这样的:
Resolve-Path $PSScriptRoot\ScriptCmdlets\*.ps1 |
? { -not ($_.ProviderPath.Contains(".Tests.")) } |
% { . $_.ProviderPath }
是的,我写的每个模块(.psm1)文件都包含相同的代码!
(4)使用MyModule.psd1
cmdlet在MyModule
内创建模块清单New-ModuleManifest
。
然后使用您的模块,只需使用Import-Module。但我建议您查看我的文章以获取更多详细信息,以便更好地了解该过程。
答案 1 :(得分:0)
如果脚本已经执行某些东西(" main"),我怀疑你是否可以。如果他们只是为Remove-ContentLine
公开Remove-ContentLine.ps1
这样的函数,您可以点源单个脚本中的所有脚本来聚合它们,或者在使用模块清单时使用ScriptsToProcess = @()
部分。 / p>
答案 2 :(得分:0)
我认为最好将每个.ps1中的函数重构为一个合适的模块。它应该基本上只是将脚本复制/粘贴到单个.psm1文件中并为其创建.psd1。请务必检查并正确处理脚本或全局范围中设置的任何内容,并且函数之间不存在命名冲突。
如果你有Sapien PowerShell Studio,那么有一个来自功能的新模块' “文件”菜单中的选项可以帮助您自动完成大部分操作。