6

我在一个长期项目的过程中编写了大量的 powershell 代码;这些脚本执行各种各样的功能,其中大多数以某种方式依赖于项目范围内的其他脚本。现在,这项工作由几个文件组成,每个文件都包含许多功能。最初,为了使用这些脚本,所有脚本文件都被随意地点源到环境中。

但是,我最近了解到 Powershell 2.0 引入了模块,我想以这种方式将这些脚本部署在一起。由于一个模块的内容都是一起加载的,我想拆分我的文件,以便每个脚本都有自己的文件,以帮助源代码控制。但是,我现在对脚本之间的联系有点不清楚。

我已经做了一些测试,似乎可以将每个函数的 Export-ModuleMember 命令移动到单独的 .ps1 文件中;这似乎更像是声明自己的范围的函数,例如 C# 中的公共和私有范围。但是,在这样做之后,我的 .psm1 文件只包含以下内容:

Get-ChildItem -recurse $psScriptRoot | where { $_.Extension -eq ".ps1" } | foreach { . $_.FullName }

这看起来对吗?所有的脚本都是点源的,所有的脚本都是在这个假设下相互引用的。他们是否应该使用相对于 $psScriptRoot 的位置来相互引用?

有没有与这两种方式不同的方式?任何人都可以提供建议吗?我对这些还不是很了解。

4

2 回答 2

6

我见过一种类似的技术,其中每个 .ps1 文件都包含一个函数,并且这些函数来源于 WPK 模块和 PSRemoteRegistry 模块中使用的 PSM1 文件。

这一行是 PSRemoteRegistry 模块:

Get-ChildItem -Path $PSScriptRoot\*.ps1 | Foreach-Object{ . $_.FullName }

我想说我喜欢这种技术,而不是拥有一个巨大的函数脚本文件。

于 2011-06-03T02:03:26.263 回答
4

您还可以查看创建清单(我实际上不知道您是否需要带有 psd1 的 psm1)。

这是我对清单的使用:

New-ModuleManifest `
    -Path Fiddler.psd1 `
    -Author "Niklas Goude" `
    -CompanyName "http://www.powershell.nu/" `
    -ModuleVersion 1.0 `
    -Description "Module from http://www.powershell.nu/2011/03/14/fiddler/</a> - psd1 created by Matt @ amonskeysden.tumblr.com" `
    -FormatsToProcess @() `
    -RequiredAssemblies @("Fiddler.dll") `
    -NestedModules @() `
    -Copyright "" `
    -ModuleToProcess "Fiddler.psm1" `
    -TypesToProcess @() `
    -FileList @("Fiddler.psm1","Fiddler.dll")

我认为您的问题的答案是将您的文件列表包含在 FileList 参数中。

我在这里写了一些我的发现(包括 MS 资源的链接):

http://amonkeysden.tumblr.com/post/5127684898/powershell-and-fiddler

于 2011-06-03T07:32:31.747 回答