42

如果我想将我的一些功能从我的主 PowerShell 脚本中分离出来,我可以将它写为一个.ps1文件和相同的点源,或者我可以将它创建为 a.psm1并使用Import-Module.

哪个更好,为什么?

4

3 回答 3

35

模块最适合库。它们使您可以更好地控制从模块导出的内容。也就是说,默认情况下,PSM1 文件中的所有脚本变量都是私有的 - 导入时在模块外部不可见。同样,所有功能都是公共的。但是,您可以在 PSM1 文件中使用 Export-ModuleMember 来准确控制从模块导出的变量、函数、别名、cmdlet 等。模块也可以从您的会话中删除,这是与 .PS1 脚本进行点源化的主要区别。另一个区别是模块函数由它们所在的模块命名,因此您可以通过在模块名称和函数名称前加上“\”前缀来轻松访问同名的基于模块的函数,例如 PSCX\Get-Uptime。在 ISE 中,此前缀还调用智能感知支持。

我通常建议使用模块。:-)

于 2013-02-14T20:01:30.190 回答
20

Dotsourcing + 脚本和模块是两个不同的东西。模块非常适合收集/分组您​​将在脚本中使用的函数和 cmdlet。如果您有想要以交互方式使用的函数(您在控制台中调用函数),那么模块可能非常适合。

如果您有一个要运行的大脚本......比如说“迁移文件共享”,或者您使用任务计划程序定期调用的单个脚本,那么点源更容易。

这取决于你需要什么。概括:

  • 如果您只是在这种情况下使用函数/脚本(脚本/作业)= 使用点源。
  • 如果您也使用其他脚本中使用的常用函数/脚本,或者您想以交互方式调用某些函数等 = 使用模块。
于 2013-02-14T19:22:13.113 回答
7

除了其他答案之外,还有一些模块功能。

  • 在 PowerShell V3 中,无需调用Import-Module即可使用模块的导出命令。这在交互式使用命令时特别有用。PowerShell 以某种方式缓存并知道所有可用的模块命令,甚至它们的帮助Get-Help SomeCommand(但是,这对于模块帮助不是真的Get-Help about_SomeModule)。

  • 点源函数和脚本模块函数的行为存在一些细微差别。将它们全部列出并不容易,这只是一个示例: Powershell scriptblock variable scope and modules 的奇怪行为,有什么建议吗? 有时使用脚本模块会很痛苦,尤其是当一个人发现不想要的差异和问题太晚时,即简单的事情在开发开始时可以正常工作,但复杂的事情后来开始出错。

总而言之,通常我使用模块,除非它们不能很好地工作。其中之一是调用脚本模块函数中传递的用户脚本块。

于 2013-02-14T23:58:20.237 回答