Cách kiểm tra xem phần đính vào PowerShell đã được tải chưa trước khi gọi Add-PSSnapin


90

Tôi có một nhóm tập lệnh PowerShell đôi khi chạy cùng nhau, đôi khi từng tập lệnh một. Mỗi tập lệnh yêu cầu tải một phần đính kèm nhất định.

Ngay bây giờ mỗi tập lệnh đang gọi Add-PSSnapin XYZở đầu.

Bây giờ nếu tôi chạy nhiều tập lệnh liên tục, các tập lệnh tiếp theo sẽ ném:

Không thể thêm Windows PowerShell snap-in XYZ vì nó đã được thêm alerady. Xác minh tên của snap-in và thử lại.

Làm cách nào để kiểm tra từng tập lệnh để xem phần đính kèm đã được tải trước khi gọi Add-PSSnapin chưa?

Câu trả lời:


133

Bạn sẽ có thể làm điều đó với một cái gì đó như thế này, nơi bạn truy vấn Snapin nhưng yêu cầu PowerShell không xảy ra lỗi nếu nó không thể tìm thấy nó:

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

À-há! Đây chính xác là những gì tôi cần, cảm ơn bạn! Tôi đã thử một cái gì đó tương tự như thế này trong thử nghiệm của mình nhưng tôi không biết về -ErrorAction SilentlyContinue.
joshuapoehls 25/09/09

2
SilentlyContinue là do Get-PSSnapin không lặng lẽ trả về null khi nếu không tìm thấy snap in theo mặc định. Nó có lỗi.
Phong phú

1
Dành cho người lười biếng: Bài viết này cung cấp một ví dụ mã đầy đủ về cách kiểm tra xem một snap-in đã được đăng ký hay chưa trước khi tải nó.
herzbube,

21

Scott đã cho bạn câu trả lời. Bạn cũng có thể tải nó và bỏ qua lỗi nếu nó đã được tải:

Add-PSSnapin -Name <snapin> -ErrorAction SilentlyContinue

6
Điều đó cũng sẽ âm thầm tiếp tục nếu snap in không tải vì các lý do khác như không được cài đặt. Điều này có thể dẫn đến các vấn đề khó chẩn đoán cho những người sử dụng tập lệnh của bạn.
Graham Ambrose

Đúng vậy, trong trường hợp đó, chúng tôi có thể kiểm tra trước nếu snap-in đã được đăng ký.
Shay Levy

4

Ngạc nhiên, không ai đề cập đến cách gốc để các tập lệnh chỉ định các phần phụ thuộc: #REQUIRES -PSSnapin Microsoft.PowerShell...chỉ thị nhận xét / tiền xử lý. Cũng giống như bạn có thể yêu cầu độ cao -RunAsAdministrator, mô-đun với -Modules Module1,Module2và một phiên bản Runspace cụ thể.

Đọc thêm bằng cách gõ Get-Help about_requires


Giải pháp này đối với tôi dường như là cách "đúng đắn" để làm điều này.
Grax32

1
Vấn đề tôi gặp phải với điều này là Powershell trả về lỗi nếu snapin yêu cầu không được tải và tôi cho rằng điều mà mọi người muốn là tải snapin nếu không.
Dwayne Driskill

1
Các mô-đun mới hơn và đó là các mô-đun được tải tự động khi cần thiết, không phải PSSnapins, bạn nói đúng. Nhưng ít nhất sẽ không có gì bị hỏng hoặc rải rác khi chạy phần script hoạt động mà không có snapin.
Alexey

3

Tôi đã thử mẫu mã của @ ScottSaad nhưng nó không hoạt động với tôi. Tôi không tìm ra chính xác lý do tại sao nhưng việc kiểm tra không đáng tin cậy, đôi khi thành công và đôi khi không. Tôi thấy rằng việc sử dụng Where-Objectbộ lọc trên thuộc Nametính hoạt động tốt hơn:

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

Mã lịch sự của điều này .


1

Scott Saads làm việc nhưng điều này có vẻ nhanh hơn đối với tôi. Tôi chưa đo nó nhưng có vẻ như nó tải nhanh hơn một chút vì nó không bao giờ tạo ra lỗi.

$snapinAdded = Get-PSSnapin | Select-String $snapinName
if (!$snapinAdded)
{
    Add-PSSnapin $snapinName
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.