Geek School: Làm việc với các bộ sưu tập trong PowerShell

Mục lục:

Geek School: Làm việc với các bộ sưu tập trong PowerShell
Geek School: Làm việc với các bộ sưu tập trong PowerShell

Video: Geek School: Làm việc với các bộ sưu tập trong PowerShell

Video: Geek School: Làm việc với các bộ sưu tập trong PowerShell
Video: Tự học Linux #7: Cài đặt/gỡ các gói ứng dụng (apt,snap) trong ubuntu - YouTube 2024, Có thể
Anonim
Vì PowerShell dựa trên.Net Framework và kết hợp nhiều công nghệ khác như WMI và CIM, luôn có nhiều cách để thực hiện cùng một điều. Hãy tham gia với chúng tôi cho bài đăng ngắn này, nơi chúng tôi tìm hiểu cách chọn phương pháp tốt nhất để hoàn thành nhiệm vụ của mình.
Vì PowerShell dựa trên.Net Framework và kết hợp nhiều công nghệ khác như WMI và CIM, luôn có nhiều cách để thực hiện cùng một điều. Hãy tham gia với chúng tôi cho bài đăng ngắn này, nơi chúng tôi tìm hiểu cách chọn phương pháp tốt nhất để hoàn thành nhiệm vụ của mình.

Hãy nhớ đọc các bài viết trước trong loạt bài này:

  • Tìm hiểu cách tự động hóa Windows bằng PowerShell
  • Học cách sử dụng Cmdlets trong PowerShell
  • Học cách sử dụng các đối tượng trong PowerShell
  • Học cách định dạng, lọc và so sánh trong PowerShell
  • Tìm hiểu cách sử dụng Remoting trong PowerShell
  • Sử dụng PowerShell để lấy thông tin máy tính

Và hãy theo dõi phần còn lại của loạt phim trong tuần.

Sử dụng Cmdlets Batch

Trước đó trong loạt bài này, khi chúng tôi giới thiệu cho bạn đường dẫn, chúng tôi đã chỉ cho bạn cách bạn có thể lấy các đối tượng mà một lệnh ghép ngắn xuất ra và chuyển chúng thành đầu vào cho một lệnh ghép ngắn khác bằng cách sử dụng một cái gì đó như sau:

Get-Process -Name notepad | Stop-Process

Điều này sẽ giết chết bất kỳ quá trình với tên "notepad". Nhưng có thể bạn sẽ tự hỏi PowerShell có thể giết mọi cá thể của notepad bằng một lệnh đơn lẻ như thế nào. Câu trả lời nằm trong sự trợ giúp của lệnh ghép ngắn Stop-Process.

help Stop-Process –Full

Image
Image

Nếu bạn nhìn vào dòng cuối cùng của mã trong phần cú pháp, bạn có thể thấy tham số InputObject chấp nhận một đối tượng kiểu Process , và bất cứ khi nào bạn thấy một kiểu theo sau là hai dấu ngoặc vuông như vậy, nó có nghĩa là tham số chấp nhận một hoặc nhiều của loại trước. Trong trường hợp này, nó chấp nhận một hoặc nhiều đối tượng quy trình. Về mặt kỹ thuật, chúng ta sẽ nói rằng lệnh ghép ngắn InputObject chấp nhận một tiến trình mảng. Bất cứ khi nào bạn có một lệnh ghép ngắn hỗ trợ các hoạt động theo cách này, hãy sử dụng nó. Đây là lựa chọn số một.

Sử dụng WMI

Mặc dù WMI không phải là công nghệ tốt nhất để xuất xưởng từ Microsoft HQ, nhưng nó lại đứng thứ hai trong danh sách về cách làm việc với các bộ sưu tập các đối tượng. Chúng ta có thể dễ dàng có được một danh sách các tiến trình đang chạy từ lớp Win32_Process như sau:

Get-WmiObject –Class Win32_Process

Vì truy vấn WMI trả về loại đối tượng riêng của nó, bạn sẽ cần phải tìm một phương thức có thể ngăn chặn quá trình, vì vậy cho phép đường dẫn đến Get-Member.
Vì truy vấn WMI trả về loại đối tượng riêng của nó, bạn sẽ cần phải tìm một phương thức có thể ngăn chặn quá trình, vì vậy cho phép đường dẫn đến Get-Member.

Get-WmiObject –Class Win32_Process | Get-Member

Có vẻ như điều gần nhất để dừng là phương pháp chấm dứt, vì vậy đó phải là phương pháp. Để gọi một phương thức trên một đối tượng WMI, bạn chỉ cần đặt nó vào Invoke-WmiMethod và chỉ định tên của phương thức.
Có vẻ như điều gần nhất để dừng là phương pháp chấm dứt, vì vậy đó phải là phương pháp. Để gọi một phương thức trên một đối tượng WMI, bạn chỉ cần đặt nó vào Invoke-WmiMethod và chỉ định tên của phương thức.

Get-WmiObject -Class Win32_Process -Filter “name=’notepad.exe'” | Invoke-WmiMethod -Name Terminate

Tuyệt vời, điều đó đã làm được điều đó. Bất cứ khi nào bạn nhận được một ReturnValue của 0 trong WMI, chỉ cần nhớ rằng lệnh được thực hiện thành công.
Tuyệt vời, điều đó đã làm được điều đó. Bất cứ khi nào bạn nhận được một ReturnValue của 0 trong WMI, chỉ cần nhớ rằng lệnh được thực hiện thành công.

Đếm

Không có hai phương thức khác, nếu bạn phải làm điều gì đó với một loạt các đối tượng, bạn có thể liệt kê toàn bộ đối tượng và hành động trên từng đối tượng riêng lẻ. Trước tiên, bạn phải tìm phương pháp bạn sẽ sử dụng để ngăn chặn một quá trình duy nhất.

Get-Process | Get-Member -MemberType Method

Hoàn hảo, có vẻ như chúng ta có thể sử dụng phương pháp Kill và sau đó đi vào ForEach-Object để tiêu diệt tất cả.
Hoàn hảo, có vẻ như chúng ta có thể sử dụng phương pháp Kill và sau đó đi vào ForEach-Object để tiêu diệt tất cả.

Get-Process -Name notepad | ForEach-Object -Process {$_.Kill()}

Ở đây chúng tôi đã lấy tất cả các đối tượng quá trình mà Get-Process trả về và chuyển chúng đến lệnh ForEach-Object. Giống như lệnh ghép ngắn Where-Object, chúng ta biểu diễn từng đối tượng trong đường ống với $ mà chúng ta có thể gọi tới phương thức Kill () trên đó. Với tất cả những gì đã nói và được thực hiện, việc liệt kê một bộ sưu tập chậm hơn nhiều so với các phương thức trên và chỉ nên được sử dụng như một kết quả cuối cùng.
Ở đây chúng tôi đã lấy tất cả các đối tượng quá trình mà Get-Process trả về và chuyển chúng đến lệnh ForEach-Object. Giống như lệnh ghép ngắn Where-Object, chúng ta biểu diễn từng đối tượng trong đường ống với $ mà chúng ta có thể gọi tới phương thức Kill () trên đó. Với tất cả những gì đã nói và được thực hiện, việc liệt kê một bộ sưu tập chậm hơn nhiều so với các phương thức trên và chỉ nên được sử dụng như một kết quả cuối cùng.

Tóm lược

Lựa chọn thứ nhất

Get-Process -Name notepad | Stop-Process

Lựa chọn thứ hai

Get-WmiObject -Class Win32_Process -Filter “name=’notepad.exe'” | Invoke-WmiMethod -Name Terminate

Lựa chọn ba

Get-Process -Name notepad | ForEach-Object -Process {$_.Kill()}

Đó là tất cả cho những người lần này, gặp bạn vào tuần tới để có thêm nhiều niềm vui cho PowerShell.

Đề xuất: