【问题标题】:Can a powershell module unload itselfpowershell模块可以自行卸载吗
【发布时间】:2011-08-01 19:34:55
【问题描述】:

我正在编写一个 powershell 脚本模块。它所做的第一件事是进行一些检查以确保某些必需的值可用。如果不是,则模块不应继续加载和初始化。但是,我不知道模块“删除”自身的方法。我尝试调用 remove-module (从模块内),但并不奇怪它不起作用。还有其他方法可以让模块自行卸载吗?

我意识到从模块外部的脚本中执行此操作将是微不足道的。但是我正在编写这个模块以与其他不太精通 powershell 的用户共享。我想不必包含模块加上另一个脚本,然后向他们解释“这是一个例外,你不能使用正常的导入模块,你必须始终记住找到并运行这个其他脚本” .除此之外,如果用户只是简单地使用 import-module (正如他们合理地期望能够做到的那样)而不是使用额外的脚本,这将无济于事。

【问题讨论】:

    标签: powershell


    【解决方案1】:

    如果检查未通过,您可能会在模块中抛出错误 - 这将阻止模块加载。例如尝试将其保存为 Test.psm1:

    throw "Could not load module.";
    

    尝试使用 Import-Module .\Test.psm1 加载它。您会收到错误消息,如果您之后调用 Get-Module,您会看到该模块尚未加载。

    【讨论】:

    • 嗯,这可能行得通。但我认为它只适用于导入时模块运行的代码,不一定是以后卸载模块的方法。例如,如果模块在导入期间运行一些代码并抛出异常,那么可能的模块将不会加载。但是,如果您运行导入模块,然后调用模块中的某个函数,然后您会发现一些内容表明模块应该卸载,我认为 throw 不会允许模块自行卸载。我想我必须做一些测试才能尝试。但是感谢您提供尝试的想法。
    • 不,你是对的,它只会停止加载,以后不会卸载。我会争辩说,也许卸载模块不是最好的方法——在模块中调用函数会从使用中删除该函数,这似乎很奇怪!有点像敲门导致房子消失......当然还有移除模块会达到什么效果?你会重新加载它,再试一次,同样的事情会发生。也许将模块置于故障状态会更好,这样如果您调用任何函数都会出现错误,直到问题得到解决?
    【解决方案2】:

    这不是您问题的确切答案,但它仍然是一个解决方案。在您描述的情况下,我会采取另一种方式。创建一个外部脚本(不是模块的一部分),它可以检查先决条件本身,如果缺少某些东西,则根本不加载模块,或者总是加载模块,检查模块暴露的成功/失败内容并卸载模块以防万一的失败。然后用这个脚本代替Import-Module

    【讨论】:

      猜你喜欢
      • 2010-11-23
      • 2020-07-15
      • 2021-05-18
      • 1970-01-01
      • 1970-01-01
      • 2017-07-23
      • 2012-04-18
      • 2011-01-05
      • 2017-07-26
      相关资源
      最近更新 更多