如何在调用Add-PSSnapin之前检查是否已加载PowerShell管理单元

时间:2009-09-25 15:28:08

标签: powershell

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

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

现在,如果我背靠背地运行多个脚本,则后续脚本抛出:

  

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

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

5 个答案:

答案 0 :(得分:132)

你应该能够用这样的东西来做,你在哪里查询Snapin,但如果找不到它,告诉PowerShell不要输出错误:

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

答案 1 :(得分:21)

斯科特已经给你答案了。您也可以加载它并忽略错误(如果它已经加载):

Add-PSSnapin -Name <snapin> -ErrorAction SilentlyContinue

答案 2 :(得分:4)

令人惊讶的是,没有人提到脚本指定依赖关系的本地方式:#REQUIRES -PSSnapin Microsoft.PowerShell...注释/预处理器指令。您可能需要使用-RunAsAdministrator-Modules Module1,Module2模块和特定的Runspace版本进行提升。

点击Get-Help about_requires

了解详情

答案 3 :(得分:3)

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

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

代码由this提供。

答案 4 :(得分:1)

斯科特萨阿德的作品虽然对我来说似乎有点快。 我没有测量它,但似乎加载速度稍微快一点,因为它永远不会产生错误消息。

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