Trường Geek làm việc với các bộ sưu tập trong PowerShell
Vì PowerShell dựa trên .Net Framework và kết hợp nhiều công nghệ khác như WMI và CIM, nên luôn có nhiều hơn một cách để thực hiện điều tương tự. Hãy tham gia với chúng tôi cho bài viết ngắn này, nơi chúng tôi tìm hiểu làm thế nào để chọn phương pháp tốt nhất để hoàn thành nhiệm vụ của chúng tôi.
Hãy chắc chắn đọc các bài viết trước trong loạt bài:
- Tìm hiểu cách tự động hóa Windows với 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 định dạng, lọc và so sánh trong PowerShell
- Tìm hiểu cách sử dụng từ xa trong PowerShell
- Sử dụng PowerShell để lấy thông tin máy tính
Và theo dõi phần còn lại của loạt bài cả tuần.
Sử dụng lệnh ghép ngắn
Trước đó trong loạt bài này, khi chúng tôi giới thiệu cho bạn về đường ố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 cmdlet xuất ra và chuyển chúng làm đầu vào cho một lệnh ghép ngắn khác bằng cách sử dụng như thế này:
Nhận-Quá trình -Tên notepad | Dừng quá trình
Điều này sẽ giết bất kỳ quá trình nào với tên là notepad notepad. Nhưng có lẽ bạn đang tự hỏi làm thế nào PowerShell có thể giết mọi phiên bản notepad chỉ bằng một lệnh. Câu trả lời nằm trong sự trợ giúp của lệnh ghép ngắn Dừng xử lý.
giúp dừng quá trình -Full
Nếu bạn nhìn vào dòng mã cuối cùng trong phần cú pháp, bạn có thể thấy rằng tham số InputObject chấp nhận một đối tượng thuộc loại Process [] và bất cứ khi nào bạn thấy một loại được theo sau bởi hai dấu ngoặc vuông như vậy 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 quá trình. Về mặt kỹ thuật, chúng tôi sẽ nói rằng lệnh ghép ngắn InputObject chấp nhận một quy 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 hàng loạt 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à phần công nghệ tốt nhất được gửi từ Microsoft HQ, nhưng nó đứng ở vị trí thứ hai trong danh sách 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 nhận được một danh sách các quy trình đang chạy từ lớp Win32_Process như vậy:
Nhận-WmiObject -Class Win32_Process
Vì truy vấn WMI trả về loại đối tượng của chính nó, bạn sẽ cần tìm một phương thức có thể dừng quá trình, vì vậy hãy cho phép đường dẫn đó đến Thành viên.
Nhận-WmiObject -Class Win32_Process | Nhận thành viên
Có vẻ như điều gần nhất để dừng lại là phương thức chấm dứt, vì vậy đó phải là phương thức. Để gọi một phương thức trên Đố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 tên name = 'notepad.exe' '| Gọi-WmiMethod -Tên chấm dứt
Tuyệt vời, điều đó đã lừa Bất cứ khi nào bạn nhận được ReturnValue bằng 0 trong WMI, chỉ cần nhớ rằng lệnh đã được thực hiện thành công.
Bảng liệt kê
Không thực hiện được hai phương thức còn lại, nếu bạn phải làm 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 thức bạn sẽ sử dụng để dừng một quá trình duy nhất.
Nhận-Quá trình | Phương thức thành viên -MemberType
Hoàn hảo, có vẻ như chúng ta có thể sử dụng phương thức Kill và sau đó chuyển vào ForEach-Object để tiêu diệt tất cả.
Nhận-Quá trình -Tên notepad | ForEach-Object -Process $ _. Kill ()
Ở đây, chúng tôi đã lấy tất cả các đối tượng tiến trình mà Get-Process trả về và chuyển chúng vào lệnh ghép ngắn ForEach-Object. Giống như lệnh ghép ngắn Where-Object, chúng tôi đã đại diện cho từng đối tượng trong đường ống với $ _ mà chúng tôi có thể gọi phương thức Kill () trên. Với tất cả những gì đã nói và làm, 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 pháp 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 một
Nhận-Quá trình -Tên notepad | Dừng quá trình
Lựa chọn hai
Get-WmiObject -Class Win32_Process -Filter tên name = 'notepad.exe' '| Gọi-WmiMethod -Tên chấm dứt
Lựa chọn ba
Nhận-Quá trình -Tên notepad | ForEach-Object -Process $ _. Kill ()
Đó là tất cả cho lần này mọi người, hẹn gặp lại vào tuần tới để có thêm niềm vui PowerShell.