Bagaimana cara memeriksa apakah snap-in PowerShell sudah dimuat sebelum memanggil Add-PSSnapin

90

Saya memiliki sekelompok skrip PowerShell yang terkadang dijalankan bersamaan, terkadang satu per satu. Setiap skrip mengharuskan snap-in tertentu dimuat.

Saat ini setiap skrip dipanggil Add-PSSnapin XYZdi awal.

Sekarang jika saya menjalankan beberapa skrip secara berurutan, skrip berikutnya akan membuang:

Tidak dapat menambahkan snap-in Windows PowerShell XYZ karena sudah ditambahkan. Verifikasi nama snap-in dan coba lagi.

Bagaimana saya bisa meminta setiap skrip memeriksa untuk melihat apakah snap-in sudah dimuat sebelum memanggil Add-PSSnapin?

joshuapoehls
sumber

Jawaban:

133

Anda harus dapat melakukannya dengan sesuatu seperti ini, di mana Anda meminta Snapin tetapi memberi tahu PowerShell untuk tidak melakukan kesalahan jika tidak dapat menemukannya:

if ( (Get-PSSnapin -Name MySnapin -ErrorAction SilentlyContinue) -eq $null )
{
    Add-PsSnapin MySnapin
}
Scott Saad
sumber
Ah-hah! Inilah yang saya butuhkan, terima kasih! Saya telah mencoba sesuatu yang mirip dengan ini dalam percobaan saya tetapi saya tidak tahu tentang -ErrorAction SilentlyContinue.
joshuapoehls
2
SilentlyContinue adalah karena Get-PSSnapin tidak diam-diam mengembalikan null jika tidak menemukan snap secara default. Ini kesalahan.
Kaya
1
Untuk yang malas: Artikel ini memberikan contoh kode lengkap bagaimana cara memeriksa apakah snap-in telah terdaftar sebelum memuatnya.
herzbube
21

Scott sudah memberi Anda jawabannya. Anda juga dapat memuatnya dan mengabaikan kesalahan jika sudah dimuat:

Add-PSSnapin -Name <snapin> -ErrorAction SilentlyContinue
Shay Levy
sumber
6
Itu juga akan berlanjut secara diam-diam jika snap in tidak dimuat karena alasan lain seperti tidak dipasang. Yang dapat menyebabkan sulitnya mendiagnosis masalah bagi orang-orang yang menggunakan skrip Anda.
Graham Ambrose
Benar, dalam hal ini kita bisa memeriksa dulu apakah snap-in sudah terdaftar.
Shay Levy
4

Anehnya, tidak ada yang menyebutkan cara asli skrip untuk menentukan dependensi: #REQUIRES -PSSnapin Microsoft.PowerShell...direktif comment / preprocessor. Hal yang sama Anda mungkin memerlukan elevasi dengan -RunAsAdministrator, modul dengan -Modules Module1,Module2, dan versi Runspace tertentu.

Baca selengkapnya dengan mengetik Get-Help about_requires

Alexey
sumber
Menurut saya, solusi ini adalah cara yang "tepat" untuk melakukan ini.
Grax32
1
Masalah yang saya alami dengan ini adalah bahwa Powershell mengembalikan kesalahan jika snapin yang diperlukan tidak dimuat dan saya berasumsi apa yang diinginkan semua orang adalah agar snapin dimuat jika tidak.
Dwayne Driskill
1
Modul lebih baru, dan itu modul yang dimuat secara otomatis sesuai kebutuhan, bukan PSSnapins, Anda benar. Tetapi setidaknya tidak ada yang akan rusak atau dikotori dengan menjalankan bagian skrip yang berfungsi tanpa snapin.
Alexey
3

Saya mencoba contoh kode @ ScottSaad tetapi tidak berhasil untuk saya. Saya belum tahu persis mengapa tetapi cek itu tidak dapat diandalkan, terkadang berhasil dan terkadang tidak. Saya menemukan bahwa menggunakan Where-Objectpemfilteran pada Nameproperti bekerja lebih baik:

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

Kode milik ini .

Andy McCl Luggage
sumber
1

Scott Saads bekerja tetapi ini tampaknya lebih cepat bagi saya. Saya belum mengukurnya tetapi sepertinya memuat sedikit lebih cepat karena tidak pernah menghasilkan pesan yang salah.

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