2009-09-25 11 views
86

Tengo un grupo de scripts de PowerShell que a veces se ejecutan juntos, a veces de a uno por vez. Cada uno de los scripts requiere que se cargue un cierto complemento.Cómo comprobar si el complemento de PowerShell ya está cargado antes de llamar a Add-PSSnapin

En este momento, cada script llama al Add-PSSnapin XYZ al principio.

Ahora si me quedo varias secuencias de comandos de back-to-back los guiones posteriores arrojan:

No se puede agregar de Windows PowerShell XYZ porque se añade alerady. Verifique el nombre del complemento y vuelva a intentarlo.

¿Cómo puedo hacer que cada script compruebe si el complemento ya está cargado antes de llamar a Add-PSSnapin?

Respuesta

126

Usted debe ser capaz de hacerlo con algo como esto, donde se consulta para el complemento, pero dice PowerShell no a error si no puede encontrarlo:

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

Ah-hah! Esto es exactamente lo que necesitaba, ¡gracias! Había intentado algo similar a esto en mis experimentos, pero no sabía sobre -ErrorAction SilentlyContinue. – joshuapoehls

+2

SilentlyContinue se debe a que Get-PSSnapin no devuelve silenciosamente null cuando no encuentra la instantánea de forma predeterminada. Se equivoca. – Rich

+1

Para el perezoso: [Este artículo] (http://mcpmag.com/articles/2009/05/19/snapins-on-standby.aspx) proporciona un ejemplo de código completo sobre cómo comprobar si un complemento está registrado antes de cargarlo – herzbube

21

de Scott ya le dio la respuesta. También puede cargar todos modos e ignorar el error si ya está cargado:

Add-PSSnapin -Name <snapin> -ErrorAction SilentlyContinue 
+6

Eso también continuaría silenciosamente si el complemento no se cargara por otros motivos, como no instalarse. Lo que podría llevar a problemas difíciles de diagnosticar para las personas que usan su script. –

+0

Derecha, en ese caso podemos verificar primero si el complemento está registrado. –

3

Traté @ ejemplo de código de ScottSaad pero no funcionó para mí. No he descubierto exactamente por qué, pero el cheque no era confiable, a veces tenía éxito y otras no. He encontrado que el uso de un filtrado Where-Object en la propiedad Name funcionó mejor:

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

cortesía Código de this.

1

Scott Saads funciona pero esto me parece algo más rápido. No lo he medido, pero parece cargarlo un poco más rápido, ya que nunca produce un mensaje de error.

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

para mi sorpresa, nadie mencionó la forma nativa para secuencias de comandos para especificar dependencias: el/la directiva #REQUIRES -PSSnapin Microsoft.PowerShell... comentario preprocesador. De la misma manera, podría requerir elevación con -RunAsAdministrator, módulos con -Modules Module1,Module2 y una versión específica de Runspace.

Leer más escribiendo Get-Help about_requires

+0

Esta solución me parece ser la forma "correcta" de hacer esto. – Grax

+0

El problema que tuve con esto es que Powershell devuelve un error si el snapin requerido no está cargado y supongo que lo que todos querrían es que el snapin se cargue si no lo está. –

+0

Los módulos son más nuevos, y son módulos que se cargan automáticamente según sea necesario, no PSSnapins, tiene razón. Pero al menos nada se romperá o ensuciará ejecutando la parte del script que funciona sin el snapin. – Alexey

Cuestiones relacionadas