Add-PSSnapin'i çağırmadan önce PowerShell ek bileşeninin zaten yüklü olup olmadığını kontrol etme


90

Bazen birlikte, bazen birer birer çalıştırılan bir grup PowerShell betiğim var. Komut dosyalarının her biri, belirli bir eklentinin yüklenmesini gerektirir.

Şu anda her komut dosyası Add-PSSnapin XYZbaşında çağırıyor .

Şimdi arka arkaya birden çok komut dosyası çalıştırırsam, sonraki komut dosyaları atar:

Windows PowerShell ek bileşeni XYZ eklenemiyor çünkü zaten eklendi. Ek bileşenin adını doğrulayın ve tekrar deneyin.

Add-PSSnapin'i çağırmadan önce her komut dosyasının ek bileşenin önceden yüklenmiş olup olmadığını kontrol etmesini nasıl sağlayabilirim?

Yanıtlar:


133

Bunu, Snapin için sorguladığınız ancak PowerShell'e bulamazsa hata yapmamasını söylediğiniz gibi bir şeyle yapabilmelisiniz:

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

Ah-hah! Bu tam olarak ihtiyacım olan şey, teşekkür ederim! Deneyimde buna benzer bir şey denedim ama -ErrorAction SilentlyContinue hakkında bilgim yoktu.
joshuapoehls

2
SilentlyContinue, Get-PSSnapin'in ek bileşeni varsayılan olarak bulamadığında sessizce null döndürmemesidir. Hata yapıyor.
Zengin

1
Tembeller için: Bu makale , yüklemeden önce bir ek bileşenin kayıtlı olup olmadığının nasıl kontrol edileceğine dair tam bir kod örneği sağlar.
herzbube

21

Scott sana cevabı zaten verdi. Yine de yükleyebilir ve zaten yüklenmişse hatayı göz ardı edebilirsiniz:

Add-PSSnapin -Name <snapin> -ErrorAction SilentlyContinue

6
Bu, ek bileşen kurulmama gibi başka nedenlerle yüklenmezse de sessizce devam eder. Bu, komut dosyanızı kullanan kişiler için sorunların teşhis edilmesinin zor olmasına yol açabilir.
Graham Ambrose

Doğru, bu durumda ilk önce eklentinin kayıtlı olup olmadığını kontrol edebiliriz.
Shay Levy

4

Şaşırtıcı bir şekilde, hiç kimse betiklerin bağımlılıkları belirlemesinin yerel yolundan bahsetmedi: #REQUIRES -PSSnapin Microsoft.PowerShell...yorum / önişlemci yönergesi. Aynı şekilde yükseltme -RunAsAdministrator, modüller -Modules Module1,Module2ve belirli bir Runspace sürümü gerekir.

Yazarak daha fazlasını okuyun Get-Help about_requires


Bu çözüm bana bunu yapmanın "doğru" yolu gibi görünüyor.
Grax32

1
Bununla ilgili yaşadığım sorun, Powershell'in, gerekli ek bileşen yüklenmemişse bir hata döndürmesidir ve eğer değilse, ek bileşeninin yüklenmesini herkesin isteyeceğini varsayabilirim.
Dwayne Driskill

1
Modüller daha yenidir ve gerektiğinde PSSnapins değil otomatik olarak yüklenen modüllerdir, haklısınız. Ancak en azından betiğin ek bileşen olmadan çalışan kısmı çalıştırıldığında hiçbir şey kırılmayacak veya dağılmayacaktır.
Alexey

3

@ ScottSaad'ın kod örneğini denedim ama benim için işe yaramadı. Tam olarak nedenini bulamadım ama çek güvenilmezdi, bazen başarılı oldu ve bazen değildi. Where-ObjectMülkte bir filtreleme kullanmanın Namedaha iyi çalıştığını buldum :

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

Kod nezaket bu .


1

Scott Saads çalışıyor ama bu bana biraz daha hızlı geliyor. Ölçmedim ama hiçbir zaman hata mesajı vermediği için biraz daha hızlı yükleniyor gibi görünüyor.

$snapinAdded = Get-PSSnapin | Select-String $snapinName
if (!$snapinAdded)
{
    Add-PSSnapin $snapinName
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.