วิธีตรวจสอบว่ามีการโหลด PowerShell snap-in แล้วหรือไม่ก่อนที่จะเรียก Add-PSSnapin


90

ฉันมีกลุ่มของสคริปต์ PowerShell ที่บางครั้งก็ทำงานร่วมกันบางครั้งก็เรียกใช้ทีละรายการ แต่ละสคริปต์ต้องการให้โหลดสแน็ปอินบางรายการ

ตอนนี้แต่ละสคริปต์กำลังเรียกAdd-PSSnapin XYZที่จุดเริ่มต้น

ตอนนี้ถ้าฉันรันหลายสคริปต์กลับไปกลับมาสคริปต์ที่ตามมาจะโยน:

ไม่สามารถเพิ่ม Windows PowerShell snap-in XYZ ได้เนื่องจากมีการเพิ่ม alerady ตรวจสอบชื่อสแน็ปอินแล้วลองอีกครั้ง

ฉันจะตรวจสอบสคริปต์แต่ละรายการเพื่อดูว่ามีการโหลดสแน็ปอินแล้วก่อนที่จะเรียก Add-PSSnapin ได้อย่างไร

คำตอบ:


133

คุณควรจะทำได้ด้วยสิ่งนี้โดยที่คุณค้นหา Snapin แต่บอก PowerShell ว่าอย่าผิดพลาดหากไม่พบ:

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

อะฮะ! นี่คือสิ่งที่ฉันต้องการขอบคุณ! ฉันได้ลองสิ่งที่คล้ายกับสิ่งนี้ในการทดลองของฉัน แต่ฉันไม่รู้เกี่ยวกับ -ErrorAction SilentlyContinue
joshuapoehls

2
SilentlyContinue เป็นเพราะ Get-PSSnapin ไม่คืนค่าว่างอย่างเงียบ ๆ เมื่อไม่พบสแน็ปอินตามค่าเริ่มต้น มันผิดพลาด
รวย

1
สำหรับคนขี้เกียจ: บทความนี้แสดงตัวอย่างโค้ดแบบเต็มวิธีการตรวจสอบว่ามีการลงทะเบียนสแน็ปอินหรือไม่ก่อนที่จะโหลด
herzbube

21

สก็อตต์ให้คำตอบคุณแล้ว นอกจากนี้คุณยังสามารถโหลดได้และละเว้นข้อผิดพลาดหากโหลดไปแล้ว:

Add-PSSnapin -Name <snapin> -ErrorAction SilentlyContinue

6
นอกจากนี้ยังจะดำเนินต่อไปอย่างเงียบ ๆ หากสแน็ปอินไม่โหลดด้วยเหตุผลอื่น ๆ เช่นไม่ได้ติดตั้ง ซึ่งอาจทำให้ยากต่อการวินิจฉัยปัญหาสำหรับผู้ที่ใช้สคริปต์ของคุณ
Graham Ambrose

ใช่ในกรณีนี้เราสามารถตรวจสอบก่อนว่ามีการลงทะเบียนสแน็ปอินหรือไม่
Shay Levy

4

น่าแปลกที่ไม่มีใครพูดถึงวิธีดั้งเดิมสำหรับสคริปต์เพื่อระบุการอ้างอิง: #REQUIRES -PSSnapin Microsoft.PowerShell...คำสั่งข้อคิดเห็น / ตัวประมวลผลล่วงหน้า เช่นเดียวกับที่คุณอาจต้องการการยกระดับด้วย-RunAsAdministratorโมดูลที่มี-Modules Module1,Module2และเวอร์ชัน Runspace เฉพาะ

อ่านเพิ่มเติมโดยพิมพ์ Get-Help about_requires


การแก้ปัญหานี้สำหรับฉันดูเหมือนจะเป็นวิธีที่ "ถูกต้อง" ในการทำเช่นนี้
Grax32

1
ปัญหาที่ฉันพบคือ Powershell ส่งคืนข้อผิดพลาดหากไม่ได้โหลด snapin ที่ต้องการและฉันคิดว่าสิ่งที่ทุกคนต้องการคือเพื่อให้โหลด snapin ถ้าไม่ได้
Dwayne Driskill

1
โมดูลใหม่กว่าและเป็นโมดูลที่โหลดโดยอัตโนมัติตามต้องการไม่ใช่ PSSnapins คุณพูดถูก แต่อย่างน้อยจะไม่มีอะไรเสียหรือทิ้งขยะโดยการเรียกใช้ส่วนของสคริปต์ที่ใช้งานได้โดยไม่ต้องใช้สแน็ปอิน
Alexey

3

ฉันลองใช้ตัวอย่างโค้ดของ @ ScottSaad แต่มันไม่ได้ผลสำหรับฉัน ฉันไม่พบสาเหตุที่แน่ชัด แต่การตรวจสอบไม่น่าเชื่อถือบางครั้งก็ทำสำเร็จและบางครั้งก็ไม่ ฉันพบว่าการใช้การWhere-ObjectกรองNameพร็อพเพอร์ตี้ทำงานได้ดีกว่า:

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

มารยาทประมวลกฎหมายนี้


1

Scott Saads ใช้งานได้ แต่ดูเหมือนว่าจะเร็วกว่าสำหรับฉัน ฉันไม่ได้วัด แต่ดูเหมือนว่าจะโหลดเร็วขึ้นเล็กน้อยเนื่องจากไม่เคยสร้างข้อความผิดพลาด

$snapinAdded = Get-PSSnapin | Select-String $snapinName
if (!$snapinAdded)
{
    Add-PSSnapin $snapinName
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.