【问题标题】:How to check if PowerShell snap-in is already loaded before calling Add-PSSnapin如何在调用 Add-PSSnapin 之前检查 PowerShell 管理单元是否已加载
【发布时间】:2010-12-01 11:16:17
【问题描述】:

我有一组 PowerShell 脚本,它们有时一起运行,有时一次运行一个。每个脚本都需要加载某个管理单元。

现在每个脚本都在开头调用Add-PSSnapin XYZ

现在,如果我连续运行多个脚本,后续脚本会抛出:

无法添加 Windows PowerShell 管理单元 XYZ,因为它已被添加。验证管理单元的名称,然后重试。

如何让每个脚本在调用 Add-PSSnapin 之前检查管理单元是否已加载?

【问题讨论】:

    标签: powershell


    【解决方案1】:

    您应该能够使用类似这样的方法来执行此操作,您可以在其中查询 Snapin,但如果找不到它,请告诉 PowerShell 不要出错:

    if ( (Get-PSSnapin -Name MySnapin -ErrorAction SilentlyContinue) -eq $null )
    {
        Add-PsSnapin MySnapin
    }
    

    【讨论】:

    • 啊哈!这正是我需要的,谢谢!我在实验中尝试过类似的方法,但我不知道 -ErrorAction SilentlyContinue。
    • SilentlyContinue 是因为 Get-PSSnapin 在默认情况下没有找到 snap in 时不会悄悄地返回 null。它出错了。
    • 对于懒惰的人:This article 提供了一个完整的代码示例,如何在加载之前检查管理单元是否已注册。
    【解决方案2】:

    Scott 已经给你答案了。你也可以加载它,如果它已经加载,则忽略错误:

    Add-PSSnapin -Name <snapin> -ErrorAction SilentlyContinue
    

    【讨论】:

    • 如果由于其他原因(例如未安装)而未加载管理单元,这也会静默继续。这可能会导致使用您的脚本的人难以诊断问题。
    • 对,这样的话我们可以先检查管理单元是否注册。
    【解决方案3】:

    令人惊讶的是,没有人提到脚本指定依赖项的本地方式:#REQUIRES -PSSnapin Microsoft.PowerShell... 注释/预处理器指令。同样,您可能需要使用 -RunAsAdministrator 提升、使用 -Modules Module1,Module2 的模块以及特定的运行空间版本。

    输入Get-Help about_requires了解更多信息

    【讨论】:

    • 这个解决方案在我看来是“正确”的方法。
    • 我遇到的问题是,如果未加载所需的管理单元,Powershell 会返回错误,我假设每个人都希望加载管理单元(如果没有加载)。
    • 模块是较新的,它是根据需要自动加载的模块,而不是 PSSnapins,你是对的。但至少不会通过运行没有管理单元的脚本部分来破坏或乱扔垃圾。
    【解决方案4】:

    我尝试了@ScottSaad 的代码示例,但它对我不起作用。我还没有找到确切的原因,但检查不可靠,有时成功,有时不成功。我发现在Name 属性上使用Where-Object 过滤效果更好:

    if ((Get-PSSnapin | ? { $_.Name -eq $SnapinName }) -eq $null) {
        Add-PSSnapin $SnapinName 
    }
    

    代码由this提供。

    【讨论】:

      【解决方案5】:

      Scott Saads 有效,但对我来说这似乎更快。 我没有测量它,但它似乎加载速度快一点,因为它从不产生错误消息。

      $snapinAdded = Get-PSSnapin | Select-String $snapinName
      if (!$snapinAdded)
      {
          Add-PSSnapin $snapinName
      }
      

      【讨论】:

        猜你喜欢
        • 2015-07-15
        • 1970-01-01
        • 1970-01-01
        • 2017-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-26
        • 2011-12-15
        相关资源
        最近更新 更多