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


90

我有一组PowerShell脚本,这些脚本有时一起运行,有时一次运行。每个脚本都需要加载特定的管理单元。

现在,每个脚本都Add-PSSnapin XYZ在开始时调用。

现在,如果我背靠背运行多个脚本,则随后的脚本会抛出:

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

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

Answers:


133

您应该可以使用类似的方法做到这一点,在其中查询Snapin,但告诉PowerShell如果找不到它,不要出错:

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

啊哈!这正是我所需要的,谢谢!我在实验中曾尝试过类似的操作,但是我不知道-ErrorAction SilentlyContinue。
joshuapoehls

2
SilentlyContinue是因为默认情况下,如果找不到该管理单元,Get-PSSnapin不会悄悄返回null。它出错了。
Rich

1
对于懒惰的人:本文提供了完整的代码示例,如何在加载管理单元之前也检查其是否已注册。
herzbube 2012年

21

斯科特已经给你答案了。您也可以随时加载它,如果已经加载,则忽略该错误:

Add-PSSnapin -Name <snapin> -ErrorAction SilentlyContinue

6
如果由于其他原因(例如未安装)未加载管理单元,该操作也将默默地继续。这可能导致使用脚本的人难以诊断问题。
Graham Ambrose

是的,在这种情况下,我们可以先检查该管理单元是否已注册。
谢伊·利维

4

令人惊讶的是,没有人提到脚本指定依赖项的本机方式:#REQUIRES -PSSnapin Microsoft.PowerShell...comment / preprocessor指令。就像您可能需要使用-RunAsAdministrator,带有的模块-Modules Module1,Module2以及特定的Runspace版本进行提升。

输入以下内容阅读更多内容 Get-Help about_requires


在我看来,此解决方案是执行此操作的“正确”方法。
Grax32

1
我遇到的问题是,如果未加载所需的管理单元,Powershell将返回错误,并且我假设每个人都希望加载的管理单元(如果未加载)。
Dwayne Driskill

1
模块是较新的,正确的是可以根据需要自动加载的模块,而不是PSSnapins。但是,运行没有管理单元的脚本部分至少不会破坏或乱扔垃圾。
Alexey,2016年

3

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

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

代码由此提供


1

斯科特·萨德斯(Scott Saads)可以工作,但是对我来说,这似乎更快。我没有测量它,但是它似乎加载得快一点,因为它永远不会产生错误消息。

$snapinAdded = Get-PSSnapin | Select-String $snapinName
if (!$snapinAdded)
{
    Add-PSSnapin $snapinName
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.