PowerShell Import-Module与Dot Sourcing

时间:2013-02-14 19:15:28

标签: powershell import-module

如果我想从我的主PowerShell脚本中分离出我的一些功能,我可以将其写为.ps1文件和点源相同,或者我可以将其创建为.psm1和使用Import-Module导入相同内容。

哪一个更好,为什么?

3 个答案:

答案 0 :(得分:27)

模块最适合图书馆。它们使您可以更好地控制从模块导出的内容。默认情况下,PSM1文件中的所有脚本变量都是私有的 - 导入时模块外部不可见。同样,所有功能都是公开的。但是,您可以在PSM1文件中使用Export-ModuleMember来准确控制从模块导出的变量,函数,别名,cmdlet等。模块也可以从会话中删除,这与点源.PS1脚本的主要区别。另一个不同之处在于模块函数由它们所在的模块命名,因此您可以通过在模块名称前添加前缀并使用“\”作为函数名称来轻松访问同名的基于模块的函数,例如: PSCX \获取正常运行时间。在ISE中,此前缀也会调用intellisense支持。

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

答案 1 :(得分:14)

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

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

这取决于你需要什么。摘要:

  • 如果你只是使用这种情况下的函数/脚本(脚本/作业)=使用点源。
  • 如果您使用其他脚本中使用的常用功能/脚本,或者您希望以交互方式调用某些功能等。= use module。

答案 2 :(得分:5)

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

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

  • 点源函数和脚本模块函数的行为有几个细微差别。列出它们并不容易,这里只是一个例子: Strange behavior with Powershell scriptblock variable scope and modules, any suggestions? 有时使用脚本模块会变得很痛苦,特别是当发现不需要的差异和问题太晚时,即在开发开始时简单的事情可以正常工作,但复杂的事情后来开始出错。

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