如果我想从我的主PowerShell脚本中分离出我的一些功能,我可以将其写为.ps1
文件和点源相同,或者我可以将其创建为.psm1
和使用Import-Module
导入相同内容。
哪一个更好,为什么?
答案 0 :(得分:27)
模块最适合图书馆。它们使您可以更好地控制从模块导出的内容。默认情况下,PSM1文件中的所有脚本变量都是私有的 - 导入时模块外部不可见。同样,所有功能都是公开的。但是,您可以在PSM1文件中使用Export-ModuleMember来准确控制从模块导出的变量,函数,别名,cmdlet等。模块也可以从会话中删除,这与点源.PS1脚本的主要区别。另一个不同之处在于模块函数由它们所在的模块命名,因此您可以通过在模块名称前添加前缀并使用“\”作为函数名称来轻松访问同名的基于模块的函数,例如: PSCX \获取正常运行时间。在ISE中,此前缀也会调用intellisense支持。
我通常建议使用模块。 : - )
答案 1 :(得分:14)
Dotsourcing +脚本和模块是两回事。模块非常适合收集/分组您将在脚本中使用的函数和cmdlet。如果你想要以交互方式使用的功能(你在控制台中调用一个函数),那么模块就非常合适。
如果您运行了一个大脚本..让我们说“迁移文件共享”,或者使用任务计划程序定期调用的单个脚本,那么点源更容易。
这取决于你需要什么。摘要:
答案 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? 有时使用脚本模块会变得很痛苦,特别是当发现不需要的差异和问题太晚时,即在开发开始时简单的事情可以正常工作,但复杂的事情后来开始出错。
总而言之,通常我会使用模块,除非它们不能正常工作。其中一个是调用脚本模块函数中传递的用户脚本块。