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

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

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

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

无法添加Windows PowerShellpipe理单元XYZ,因为它已被添加。 validationpipe理单元的名称,然后重试。

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

你应该可以做到这一点,你可以在这里查询Snapin,但是告诉PowerShell如果找不到就会报错:

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

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

 Add-PSSnapin -Name <snapin> -ErrorAction SilentlyContinue 

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

通过inputGet-Help about_requires来阅读更多信息

我试过@ ScottSaad的代码示例,但它不适用于我。 我还没有find确切的原因,但支票是不可靠的,有时成功,有时不成功。 我发现在Name属性上使用Where-Object过滤效果更好:

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

代码礼貌这一点 。

斯科特·萨德斯的作品,但这似乎更快一些。 我没有测量它,但它似乎加载只是一点点,因为它从来没有产生一个错误消息。

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