我可以从一堆单功能脚本中创建一个模块吗?

时间:2016-08-23 13:08:12

标签: powershell

我们已经积累了一堆脚本,每个脚本都看起来像CmdLets,即它有一组声明的参数,然后它立即调用一个Main函数来完成工作,调用私有子函数。 / p>

一个例子是Remove-ContentLine.ps1,它只是吐出文件或管道输入的内容,除了匹配某些模式的行。

所以他们喜欢小小的"功能脚本"。

有没有什么方法可以将这些脚本聚合到一个模块中,同时保持它们与文件完全一样?

修改

如果您的预感是更容易复制粘贴并将其重构为psm1,那么只需说;)

3 个答案:

答案 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,那么有一个来自功能的新模块' “文件”菜单中的选项可以帮助您自动完成大部分操作。