我有一组PowerShell脚本,这些脚本有时一起运行,有时一次运行。每个脚本都需要加载特定的管理单元。
现在,每个脚本都Add-PSSnapin XYZ
在开始时调用。
现在,如果我背靠背运行多个脚本,则随后的脚本会抛出:
由于添加了Windows PowerShell管理单元XYZ,因此无法添加它。验证管理单元的名称,然后重试。
在调用Add-PSSnapin之前,如何让每个脚本检查该管理单元是否已加载?
Answers:
您应该可以使用类似的方法做到这一点,在其中查询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版本进行提升。
输入以下内容阅读更多内容 Get-Help about_requires
我尝试了@ScottSaad的代码示例,但对我而言不起作用。我还没有找到确切的原因,但是检查不可靠,有时成功,有时不成功。我发现Where-Object
对Name
属性使用过滤效果更好:
if ((Get-PSSnapin | ? { $_.Name -eq $SnapinName }) -eq $null) {
Add-PSSnapin $SnapinName
}
代码由此提供。
斯科特·萨德斯(Scott Saads)可以工作,但是对我来说,这似乎更快。我没有测量它,但是它似乎加载得快一点,因为它永远不会产生错误消息。
$snapinAdded = Get-PSSnapin | Select-String $snapinName
if (!$snapinAdded)
{
Add-PSSnapin $snapinName
}