Como verificar se o snap-in do PowerShell já está carregado antes de chamar Add-PSSnapin

90

Eu tenho um grupo de scripts do PowerShell que às vezes são executados juntos, às vezes um de cada vez. Cada um dos scripts requer que um determinado snap-in seja carregado.

No momento, cada script está chamando Add-PSSnapin XYZno início.

Agora, se eu executar vários scripts consecutivos, os scripts subsequentes geram:

Não é possível adicionar o snap-in XYZ do Windows PowerShell porque ele já foi adicionado. Verifique o nome do snap-in e tente novamente.

Como posso fazer com que cada script verifique se o snap-in já está carregado antes de chamar Add-PSSnapin?

joshuapoehls
fonte

Respostas:

133

Você deve ser capaz de fazer isso com algo assim, onde você consulta o Snapin, mas diz ao PowerShell para não errar se não puder encontrá-lo:

if ( (Get-PSSnapin -Name MySnapin -ErrorAction SilentlyContinue) -eq $null )
{
    Add-PsSnapin MySnapin
}
Scott Saad
fonte
Ah-hah! Isso é exatamente o que eu precisava, obrigado! Eu havia tentado algo semelhante a isso em meus experimentos, mas não sabia sobre o -ErrorAction SilentlyContinue.
joshuapoehls
2
O SilentlyContinue ocorre porque Get-PSSnapin silenciosamente não retorna nulo quando se não encontra o snap in por padrão. Erro.
Rich,
1
Para preguiçosos: este artigo fornece um exemplo de código completo de como também verificar se um snap-in está registrado antes de carregá-lo.
herzbube
21

Scott já te deu a resposta. Você também pode carregá-lo de qualquer maneira e ignorar o erro se já estiver carregado:

Add-PSSnapin -Name <snapin> -ErrorAction SilentlyContinue
Shay Levy
fonte
6
Isso também continuaria silenciosamente se o snap in não carregasse por outros motivos, como não ter sido instalado. O que pode dificultar o diagnóstico de problemas para as pessoas que usam seu script.
Graham Ambrose
Certo, nesse caso podemos verificar primeiro se o snap-in está registrado.
Shay Levy
4

Surpreendentemente, ninguém mencionou a maneira nativa dos scripts especificarem dependências: a #REQUIRES -PSSnapin Microsoft.PowerShell...diretiva de comentário / pré-processador. Da mesma forma, você pode exigir elevação com -RunAsAdministrator, módulos com -Modules Module1,Module2e uma versão específica do Runspace.

Leia mais digitando Get-Help about_requires

Alexey
fonte
Essa solução me parece a maneira "certa" de fazer isso.
Grax32
1
O problema que tive com isso é que o Powershell retorna um erro se o snapin necessário não estiver carregado e eu diria que o que todos gostariam é que o snapin fosse carregado se não estivesse.
Dwayne Driskill
1
Os módulos são mais recentes e são carregados automaticamente quando necessário, não PSSnapins, você está certo. Mas pelo menos nada será quebrado ou desordenado ao executar a parte do script que funciona sem o snap-in.
Alexey
3

Tentei o exemplo de código de @ScottSaad, mas não funcionou para mim. Não descobri exatamente o porquê, mas o cheque não era confiável, às vezes dando certo e às vezes não. Descobri que usar um Where-Objectfiltro na Namepropriedade funcionou melhor:

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

Código cortesia deste .

Andy McCluggage
fonte
1

Scott Saads funciona, mas isso parece um pouco mais rápido para mim. Eu não o medi, mas parece carregar um pouco mais rápido, pois nunca produz uma mensagem de erro.

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