2010-01-04 24 views
29

Đôi khi chúng ta cần thực hiện các tác vụ quản trị nhỏ trong SharePoint. Một kịch bản PowerShell đơn giản là một công cụ thực sự tốt cho điều đó. Ví dụ, kịch bản như vậy có thể liệt kê xử lý sự kiện của một danh sách:Làm thế nào xấu là nó không vứt bỏ() trong Powershell?

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint") 
$site = new-object Microsoft.SharePoint.SPSite($args[0]) 
$site.RootWeb.Lists["MyList"].EventReceivers > C:\MyListHandlers.txt 

Người ta biết rằng đối tượng như SPSiteSPWeb phải Dispose() -d sau khi một cuộc gọi, nếu không rò rỉ bộ nhớ xảy ra. Điều tốt nhất là gọi

$site.RootWeb.dispose() 
$site.dispose() 

ở cuối tập lệnh này. Nhưng nếu đây là một kịch bản Powershell mà sẽ chỉ được chạy một lần, và chúng ta biết rằng PowerShell làm sạch sau khi thực hiện - là nó rất xấu để không gọi vứt bỏ()?

Vì vậy, câu hỏi của tôi là - có một số nguy hiểm nếu đôi khi tôi chạy các tập lệnh như thế này; nó sẽ ảnh hưởng đến sự ổn định tổng thể của trang trại SharePoint (hoặc của máy chủ mà trên đó tôi đang chạy tập lệnh)?

+2

Công cụ tuyệt vời nhưng nó có mùi giống như Perl và giữ tôi đi;) –

+3

Đó là ấn tượng đầu tiên của tôi, nhưng nó cho phép làm việc với bất kỳ lớp .net nào mà không biên dịch v.v. – naivists

Trả lời

16

này đã được chỉnh sửa để bao gồm một, câu trả lời không đặc hiệu an toàn.

IN CHUNG: vứt bỏ mọi thứ, vì Vứt bỏ là cách của .NET framework để giải phóng tài nguyên bên ngoài (chẳng hạn như xử lý tệp, cổng TCP, kết nối cơ sở dữ liệu, v.v.). Tài nguyên không được đảm bảo sẽ được phát hành trừ khi bạn gọi Dispose(). Cẩn thận. Đây là câu trả lời chung, không phải của SharePoint.

ĐẶC BIỆT KHI XỬ LÝ VỚI SharePoint: Khi bạn đóng quá trình PowerShell.exe, bộ nhớ sẽ được giải phóng. Nếu bạn cần vứt bỏ đồ vật để giảm áp lực bộ nhớ (quan trọng trong môi trường sản xuất hoặc nếu bạn đang lặp qua tất cả các trang web/web), hãy đảm bảo vứt bỏ. Nếu không, bạn không cần phải lo lắng về việc vứt bỏ.

Lý do tại sao chúng tôi quá điên rồ về xử lý ở nơi đầu tiên là vì hầu hết mã SharePoint chạy trong các quy trình chạy dài (trong quy trình công nhân ASP.NET hoặc OWSTimer.exe) và không xử lý có thể gây khó khăn khắc phục sự cố, thảm họa đột ngột (tức là máy chủ web đang bùng nổ). Những vấn đề hiệu suất thảm họa/OutOfMemoryExceptions không ảnh hưởng đến tôi hầu hết thời gian khi làm việc trong PowerShell. Tôi chạy các kịch bản đặc biệt, tôi lãng phí ~ 3-50MB RAM vì tôi không vứt bỏ các đối tượng của mình, tôi đóng cửa sổ PowerShell và bộ nhớ được giải phóng. Hầu hết thời gian không phải là phát hành.

Tôi đã tạo các tập lệnh để làm việc với SharePoint và hầu hết thời gian tôi không bận tâm xử lý.

Here is a script wherein I dispose SPSite and SPWeb objects

Here is a script in which I don't bother to dispose an SPSite object

+1

Cảm ơn câu trả lời. Kịch bản hay trong các liên kết này, btw. – naivists

+2

cảm ơn! Có một dự án CodePlex tốt đã thu thập hàng chục tập lệnh liên quan đến SP: http://sharepointpsscripts.codeplex.com –

+2

Thực ra điều đó không chính xác đúng - khi quá trình kết thúc, có bộ nhớ được giải phóng nhưng không được vứt bỏ cũng như Finalize. Tất cả phụ thuộc vào những gì đối tượng làm trong Vứt bỏ nhưng trong thực tế, sự khác biệt này có lẽ không quan trọng. – Josh

2

Nếu trình duyệt đang truy cập tài nguyên bên ngoài có thời lượng lâu hơn tuổi thọ của tập lệnh PowerShell, thì nó sẽ gọi là Vứt bỏ.

Tuy nhiên, nếu đó là tài nguyên được tập lệnh phân bổ, thì không cần phải dọn dẹp. Khi kịch bản thoát, thì tất cả bộ nhớ được cấp phát cho tập lệnh sẽ được dọn sạch.

+2

Điều này không đúng. Ngay cả khi nó được phân bổ bởi kịch bản, nó có thể gây ra các ngoại lệ bộ nhớ xuống đường. (Tại sao mọi người coi kịch bản là công dân cấp thấp? ☺) – Ariel

4

Lý tưởng nhất là bạn nên gọi Vứt bỏ khi có thể. Ngay cả bên trong PowerShell.

Thư viện SharePoint bao gồm nhiều mã chỉ là một trình bao bọc xung quanh các đối tượng COM - và để làm cho cuộc sống trở nên thú vị hơn, nhiều đối tượng COM có các nhóm và bộ nhớ riêng của chúng. Cuộc gọi .NET to Dispose thực sự chỉ hướng dẫn các đối tượng COM mà chúng có thể giải phóng các đối tượng của riêng chúng (có thể có tuổi thọ bên ngoài quá trình gọi).

Dưới đây là một số thông tin có liên quan hơn: http://blogs.msdn.com/sharepoint/archive/2009/02/11/sharepoint-and-powershell-knowledge.aspx

2

Trong khi bế mạc quá trình sẽ làm sạch mọi thứ lên, hãy cẩn thận. Nếu bạn đã làm một vòng lặp liên quan đến tất cả các trang web trong trang trại của bạn, một việc vứt bỏ mất tích có thể nhanh chóng ăn một lượng đáng kể bộ nhớ sẽ làm chậm máy chủ của bạn để thu thập thông tin. Kể từ khi kịch bản là hữu ích nhất cho hoạt động hàng loạt, luôn luôn ghi nhớ điều đó.

3

Chỉ cần theo dõi this.

Thậm chí nếu đó là một kịch bản đơn giản mà giải phóng bộ nhớ khi thực hiện, bạn không bao giờ biết liệu tại một số điểm mà Gonna Be sao chép/dán vào một vòng lặp bên trong của một kịch bản lớn hơn :-)

Đối với tính chính xác, bạn nên luôn luôn vứt bỏ các đối tượng SP như được chỉ định trong liên kết ở trên.

+1

Điểm về việc sao chép/dán vào một kịch bản lớn hơn là soo-o đúng. Tôi đã nhìn thấy kịch bản được thực hiện bởi một số quản trị viên, một sự kết hợp của các kịch bản khác nhau được tìm thấy trên web mà "như là một tác dụng phụ" thực hiện cũng là điều người quản trị cần thiết tại thời điểm đó ;-) – naivists

Các vấn đề liên quan