如何在调用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 }