如果我想将我的一些功能从我的主 PowerShell 脚本中分离出来,我可以将它写为一个.ps1
文件和相同的点源,或者我可以将它创建为 a.psm1
并使用Import-Module
.
哪个更好,为什么?
如果我想将我的一些功能从我的主 PowerShell 脚本中分离出来,我可以将它写为一个.ps1
文件和相同的点源,或者我可以将它创建为 a.psm1
并使用Import-Module
.
哪个更好,为什么?
模块最适合库。它们使您可以更好地控制从模块导出的内容。也就是说,默认情况下,PSM1 文件中的所有脚本变量都是私有的 - 导入时在模块外部不可见。同样,所有功能都是公共的。但是,您可以在 PSM1 文件中使用 Export-ModuleMember 来准确控制从模块导出的变量、函数、别名、cmdlet 等。模块也可以从您的会话中删除,这是与 .PS1 脚本进行点源化的主要区别。另一个区别是模块函数由它们所在的模块命名,因此您可以通过在模块名称和函数名称前加上“\”前缀来轻松访问同名的基于模块的函数,例如 PSCX\Get-Uptime。在 ISE 中,此前缀还调用智能感知支持。
我通常建议使用模块。:-)
Dotsourcing + 脚本和模块是两个不同的东西。模块非常适合收集/分组您将在脚本中使用的函数和 cmdlet。如果您有想要以交互方式使用的函数(您在控制台中调用函数),那么模块可能非常适合。
如果您有一个要运行的大脚本......比如说“迁移文件共享”,或者您使用任务计划程序定期调用的单个脚本,那么点源更容易。
这取决于你需要什么。概括:
除了其他答案之外,还有一些模块功能。
在 PowerShell V3 中,无需调用Import-Module
即可使用模块的导出命令。这在交互式使用命令时特别有用。PowerShell 以某种方式缓存并知道所有可用的模块命令,甚至它们的帮助Get-Help SomeCommand
(但是,这对于模块帮助不是真的Get-Help about_SomeModule
)。
点源函数和脚本模块函数的行为存在一些细微差别。将它们全部列出并不容易,这只是一个示例: Powershell scriptblock variable scope and modules 的奇怪行为,有什么建议吗? 有时使用脚本模块会很痛苦,尤其是当一个人发现不想要的差异和问题太晚时,即简单的事情在开发开始时可以正常工作,但复杂的事情后来开始出错。
总而言之,通常我使用模块,除非它们不能很好地工作。其中之一是调用脚本模块函数中传递的用户脚本块。