PowerShell导入模块与点源

PowerShell导入模块与点源,powershell,import-module,Powershell,Import Module,如果我想从我的主PowerShell脚本中分离出一些功能,我可以将其作为.ps1文件和相同的点源代码编写,也可以将其创建为.psm1并使用导入模块导入 哪个更好?为什么?Dotsourcing+脚本和模块是两件不同的事情。模块非常适合收集/分组脚本中使用的函数和cmdlet。若您有想要以交互方式使用的函数(您在控制台中调用函数),那个么模块非常适合 如果你有一个大的脚本,你运行。。比如说“迁移文件共享”,或者使用任务调度器定期调用的单个脚本,那么dot-sourcing就更容易了 这取决于你需要

如果我想从我的主PowerShell脚本中分离出一些功能,我可以将其作为
.ps1
文件和相同的点源代码编写,也可以将其创建为
.psm1
并使用
导入模块导入


哪个更好?为什么?

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

如果你有一个大的脚本,你运行。。比如说“迁移文件共享”,或者使用任务调度器定期调用的单个脚本,那么dot-sourcing就更容易了

这取决于你需要什么。总结:

  • 如果在这种情况下仅使用函数/脚本(脚本/作业)=使用点源
  • 如果您也使用其他脚本中使用的常用函数/脚本,或者您希望以交互方式调用某些函数等=使用模块

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


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

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

  • 在PowerShell V3中,无需调用
    导入模块
    ,即可使用模块的导出命令。当以交互方式使用命令时,这尤其有用。PowerShell以某种方式缓存并知道所有可用的模块命令,甚至它们的帮助
    获取帮助SomeCommand
    (但对于模块帮助
    获取有关_SomeModule的帮助
    ,情况并非如此)

  • 点源函数和脚本模块函数的行为存在一些细微的差异。要将它们全部列出并不容易,这里仅举一个例子: 有时使用脚本模块会让人感到痛苦,尤其是当发现不必要的差异和问题太晚时,即简单的事情在开发之初可以正常工作,但复杂的事情在开发之后开始出错


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

我发现所有的答案都很有帮助。我不能把任何一个具体的问题作为这个问题的答案。所以,我只是给他们每人投一票。希望它有意义。谢谢你所有的建议。如果你认为你已经有了答案,即使是组合答案,还是选择一个更好。(顺便说一句,不是我的,它只是添加了备注)。您对从模块中加载(
dotsourcing
.PS1
脚本有何想法?这是一种方法,我认为这很好。源于点的脚本将被限定在该模块的范围内。Powershell如何知道我刚刚创建并将其命名为someModule.psm1的文本文件?!Powershell是否永久扫描我的文件系统以查找此类文件?!在某些情况下,PowerShell会扫描标准模块位置,并读取和缓存新模块和更改的模块。据我所知,没有记录详细信息。据我所知,Powershell只检查
$Env:PSModulePath
指定的文件夹中的文件。(见附件)