Come verificare se lo snap-in di PowerShell è già caricato prima di chiamare Add-PSSnapin


90

Ho un gruppo di script PowerShell che a volte vengono eseguiti insieme, a volte uno alla volta. Ciascuno degli script richiede il caricamento di un determinato snap-in.

In questo momento ogni script sta chiamando Add-PSSnapin XYZall'inizio.

Ora se eseguo più script uno dopo l'altro, gli script successivi generano:

Impossibile aggiungere XYZ snap-in di Windows PowerShell perché è già stato aggiunto. Verificare il nome dello snap-in e riprovare.

Come posso fare in modo che ogni script controlli per vedere se lo snap-in è già caricato prima di chiamare Add-PSSnapin?

Risposte:


133

Dovresti essere in grado di farlo con qualcosa di simile, dove esegui una query per lo snap-in ma dici a PowerShell di non commettere errori se non riesce a trovarlo:

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

Ah-ah! Questo è esattamente ciò di cui avevo bisogno, grazie! Avevo provato qualcosa di simile a questo durante i miei esperimenti, ma non sapevo di -ErrorAction SilentlyContinue.
joshuapoehls,

2
Il SilentlyContinue è perché Get-PSSnapin non restituisce silenziosamente null quando if non trova lo snap in per impostazione predefinita. Sbaglia.
Rich

1
Per i più pigri: questo articolo fornisce un esempio di codice completo su come verificare anche se uno snap-in è registrato prima di caricarlo.
herzbube

21

Scott ti ha già dato la risposta. Puoi anche caricarlo comunque e ignorare l'errore se è già caricato:

Add-PSSnapin -Name <snapin> -ErrorAction SilentlyContinue

6
Ciò continuerebbe anche silenziosamente se lo snap in non viene caricato per altri motivi, come non essere installato. Ciò potrebbe portare a problemi di diagnosi difficile per le persone che utilizzano il tuo script.
Graham Ambrose

Bene, in quel caso possiamo prima controllare se lo snap-in è registrato.
Shay Levy

4

Sorprendentemente, nessuno ha menzionato il modo nativo per gli script di specificare le dipendenze: la #REQUIRES -PSSnapin Microsoft.PowerShell...direttiva comment / preprocessor. Allo stesso modo potresti richiedere l'elevazione con -RunAsAdministrator, i moduli con -Modules Module1,Module2e una versione specifica di Runspace.

Leggi di più digitando Get-Help about_requires


Questa soluzione mi sembra essere il modo "giusto" per farlo.
Grax32

1
Il problema che ho avuto con questo è che Powershell restituisce un errore se lo snap-in richiesto non è caricato e presumo che ciò che tutti vorrebbero sia che lo snap-in venga caricato se non lo è.
Dwayne Driskill

1
I moduli sono più recenti e sono i moduli che vengono caricati automaticamente secondo necessità, non PSSnapins, hai ragione. Ma almeno niente sarà rotto o disseminato eseguendo la parte dello script che funziona senza lo snap-in.
Alexey

3

Ho provato l'esempio di codice di @ ScottSaad ma non ha funzionato per me. Non ho scoperto esattamente il motivo, ma il controllo non è stato affidabile, a volte ha avuto successo ea volte no. Ho scoperto che l'utilizzo di un Where-Objectfiltro sulla Nameproprietà ha funzionato meglio:

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

Codice per gentile concessione di questo .


1

Scott Saads funziona ma mi sembra un po 'più veloce. Non l'ho misurato ma sembra caricarsi solo un po 'più velocemente in quanto non produce mai un messaggio di errore.

$snapinAdded = Get-PSSnapin | Select-String $snapinName
if (!$snapinAdded)
{
    Add-PSSnapin $snapinName
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.