Trường Geek Tìm hiểu cách sử dụng công việc trong PowerShell
PowerShell có bốn loại công việc - Công việc nền, Công việc từ xa, Công việc WMI và Công việc được lên lịch. Tham gia với chúng tôi khi chúng tôi tìm ra chúng là gì và làm thế nào chúng ta có thể sử dụng chúng.
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
- Làm việc với Bộ sưu tập trong PowerShell
Và theo dõi phần còn lại của loạt bài cả tuần.
Công việc nền
Cho đến bây giờ mọi thứ tôi đã chỉ cho bạn trong PowerShell đều đồng bộ, có nghĩa là chúng ta nhập một cái gì đó vào vỏ và không thể thực sự làm gì nhiều cho đến khi lệnh đó hoàn thành. Đây là nơi xuất hiện các công việc nền. Để bắt đầu một nền, công việc chỉ cần chuyển một khối tập lệnh vào lệnh ghép ngắn Start-Job.
Bắt đầu-Công việc -Tên GetFileList -Scriptblock Get-ChildItem C: \ -Recurse
Bây giờ chúng tôi có thể tự do làm bất cứ điều gì chúng tôi muốn trong trình bao trong khi khối tập lệnh đó thực thi trong nền.
Khi bạn bắt đầu một công việc mới, PowerShell sẽ tạo một đối tượng công việc mới đại diện cho công việc đó. Bạn có thể nhận danh sách tất cả các công việc bất cứ lúc nào bằng cách chạy lệnh ghép ngắn Get-Job.
Các đối tượng công việc cho bạn biết về tình trạng của các công việc. Ví dụ, trong ảnh chụp màn hình ở trên, chúng ta có thể thấy rằng chúng ta có một BackgroundJob có tên GetFileList vẫn đang chạy, nhưng đã bắt đầu trả về dữ liệu. Nếu tại bất kỳ thời điểm nào bạn quyết định rằng công việc đã chạy quá lâu, bạn có thể dễ dàng dừng nó bằng cách chuyển nó sang Stop-Job.
Nhận công việc -Tên GetFileList | Dừng công việc
Tuy nhiên, một khi bạn đã dừng một công việc, bất kỳ dữ liệu nào nó nhận được cho đến khi bạn dừng nó vẫn có sẵn. Có một gotcha, mặc dù. Trong PowerShell, khi bạn nhận được kết quả cho công việc, chúng sẽ bị xóa. Để chúng được duy trì, bạn phải chỉ định tham số chuyển đổi giữ của Nhận-công việc.
Nhận công việc -Tên GetFileList | Nhận-công việc-Giữ
Một khi bạn đã hoàn thành một công việc, cách tốt nhất là loại bỏ nó. Để loại bỏ công việc, chỉ cần đặt nó vào lệnh ghép ngắn Remove-Job.
Nhận công việc -Tên GetFileList | Loại bỏ công việc
Điều này sẽ xóa nó khỏi danh sách các công việc được Get-Job trả về.
Công việc từ xa
Một vài bài học trước đây, chúng tôi đã xem xét cách chúng tôi có thể sử dụng điều khiển từ xa để thực thi các lệnh PowerShell trên một máy từ xa bằng Invoke-Command, nhưng bạn có biết bạn cũng có thể sử dụng Invoke-Command để khởi động công việc từ xa trong nền không? Để làm như vậy, chỉ cần thêm tham số -AsJob vào cuối lệnh của bạn:
Gọi lệnh -ComputerName Flash, Viper -Credential Administrator -ScriptBlock gci -AsJob
Đó là một lệnh đơn giản và đáng lẽ đã hoàn thành việc thực thi ngay bây giờ vì vậy hãy xem trạng thái công việc của chúng tôi.
Hmm, có vẻ như nó đã thất bại. Điều này mang lại cho tôi vào gotcha đầu tiên của tôi với công việc. Khi bạn tạo một công việc mới thuộc bất kỳ loại nào trong PowerShell, nó sẽ tạo một công việc mẹ ngoài một công việc con cho mọi máy tính mà bạn đang thực hiện công việc đó. Khi bạn sử dụng lệnh ghép ngắn Get-Job, nó chỉ hiển thị cho bạn các công việc mẹ và thuộc tính trạng thái là trường hợp xấu nhất, nghĩa là ngay cả khi lệnh chỉ không chạy trên một trong số một trăm máy tính, trạng thái công việc mẹ sẽ nói thất bại. Để xem danh sách các công việc con, bạn cần sử dụng tham số BaoChildJob.
Nếu bạn nhìn kỹ hơn, bạn sẽ thấy rằng công việc thực sự chỉ thất bại trên một máy tính, điều này đưa chúng ta đến gotcha tiếp theo. Khi bạn thử và nhận kết quả cho công việc, nếu bạn chỉ định tên công việc hoặc ID của cha mẹ, PowerShell sẽ trả về dữ liệu từ tất cả các công việc con. Vấn đề là nếu có một lỗi trong một trong các công việc con, chúng ta sẽ bị bỏ lại với một số văn bản màu đỏ.
Có hai cách để khắc phục điều này. Đầu tiên, nếu bạn biết máy tính nào bạn muốn có kết quả, bạn chỉ cần sử dụng tham số ComputerName của lệnh ghép ngắn Nhận được -Job.
Nhận việc -Id 3 | Nhận-Công việc -Keep -ComputerName Viper
Ngoài ra, bạn có thể nhận kết quả từ một công việc con cụ thể bằng cách sử dụng id công việc của nó.
Nhận công việc -Id 3 -IncludeChildJob
Nhận việc -Id 5 | Nhận-công việc-Giữ
Việc làm WMI
Công việc WMI giống như Công việc từ xa, chỉ yêu cầu tham số -AsJob được thêm vào lệnh ghép ngắn Get-WmiObject.
Thật không may, điều này có nghĩa là chúng cũng chịu cùng một vấn đề mà tôi đã đề cập trong phần Công việc từ xa.
Công việc theo lịch trình
Ba loại công việc cuối cùng mà chúng tôi đã xem xét không liên tục, có nghĩa là chúng chỉ có sẵn trong phiên hiện tại của bạn. Về cơ bản, điều đó có nghĩa là nếu bạn khởi động một công việc và sau đó mở một Bảng điều khiển PowerShell khác và chạy Get-Job, bạn sẽ không thấy bất kỳ công việc nào. Tuy nhiên, quay trở lại bảng điều khiển mà bạn đã bắt đầu công việc, bạn sẽ có thể thấy trạng thái của nó. Điều này trái ngược với Công việc được lên lịch là cố chấp. Về cơ bản, Công việc được lên lịch là một khối tập lệnh chạy theo lịch trình. Trước đây, ảnh hưởng tương tự có thể đạt được khi sử dụng Bộ lập lịch tác vụ Windows, đây thực sự là những gì đang xảy ra bên dưới mui xe. Để tạo một Công việc được lên lịch mới, chúng tôi thực hiện như sau:
Đăng ký-Lên lịchJob -Tên GetEventLogs -ScriptBlock Get-EventLog -LogName Bảo mật-Mới nhất 100 -Trigger (Mới-Công việc
Có khá nhiều thứ đang diễn ra trong lệnh đó, vì vậy hãy phá vỡ nó.
- Đầu tiên, chúng tôi cung cấp cho Công việc được lên lịch của mình một tên của GetEventLogs.
- Sau đó, chúng tôi nói với nó rằng khi được kích hoạt, chúng tôi muốn nó chạy nội dung của khối tập lệnh được chỉ định, về cơ bản sẽ nhận được 100 mục mới nhất của nhật ký sự kiện Bảo mật.
- Tiếp theo, chúng tôi chỉ định một kích hoạt. Do tham số kích hoạt lấy đối tượng kích hoạt làm đầu vào, chúng tôi đã sử dụng lệnh gốc để tạo ra trình kích hoạt sẽ tắt mỗi ngày vào lúc 5 giờ chiều.
- Vì chúng ta đang xử lý nhật ký sự kiện, chúng ta cần chạy với tư cách quản trị viên, chúng ta có thể chỉ định bằng cách tạo một đối tượng lên lịch biểu mới và chuyển nó đến tham số lên lịch.
Vì đây là một loại công việc hơi khác nhau, bạn cũng sẽ cần sử dụng một lệnh khác để lấy danh sách tất cả các công việc được lên lịch trên máy.
Get-Lên lịchJob
Thats tất cả để có nó.