PowerShell are patru tipuri de locuri de muncă - locuri de muncă de fundal, locuri de muncă la distanță, locuri de muncă WMI și locuri de muncă programate. Alăturați-vă nouă pe măsură ce aflați ce sunt și cum le putem folosi.
Asigurați-vă că citiți articolele anterioare din seria:
Și stați liniștit pentru restul seriei toată săptămâna.
Până acum, tot ceea ce ți-am arătat în PowerShell a fost sincron, adică introducem ceva în coajă și nu putem face prea mult până când comanda nu a terminat executarea. Aici intră locurile de muncă de fundal. Pentru a începe un fundal, trebuia să treci doar un bloc de script în cmdletul Start-Job.
Start-Job -Sunt GetFileList -Scriptblock Get-ChildItem C: \ -Recurse
Acum suntem liberi să facem tot ce ne dorim în cadrul shell-ului în timp ce blocul de script se execută în fundal.
Când lansați un nou loc de muncă, PowerShell creează un nou obiect de activitate care reprezintă lucrarea respectivă. Puteți obține o listă a tuturor lucrărilor în orice moment, executând cmdlet-ul Get-Job.
Obiectele de lucru vă informează despre starea lucrărilor. De exemplu, în captura de ecran de mai sus putem vedea că avem un BackgroundJob numit GetFileList, care încă se execută, dar a început deja să returneze date. Dacă în orice moment decideți că lucrarea a funcționat prea mult timp, o puteți opri cu ușurință prin trasarea acesteia în Stop-Job.
Get-Job - Numele GetFileList | Stop-Job
Cu toate acestea, odată ce ați oprit o activitate, oricare ar fi datele pe care le-ați primit până când punctul în care ați oprit-o este încă disponibil. Există însă o problemă. În PowerShell, odată ce veți primi rezultatele pentru un loc de muncă, acestea vor fi șterse. Pentru ca aceștia să rămână, trebuie să specificați parametrul "Întreținere-păstrare" a comenzii de întreținere.
Get-Job - Numele GetFileList | Primiți-Job-KEEP
Odată ce ați terminat un loc de muncă, este cea mai bună practică să o eliminați. Pentru a elimina lucrarea, pur și simplu trageți-o în cmdletul Remove-Job.
Get-Job - Numele GetFileList | Eliminați-Job
Aceasta va elimina din lista de lucrări returnate de Get-Job.
Acum câteva lecții am analizat modul în care putem folosi remoting-ul pentru a executa comenzile PowerShell pe o mașină de la distanță folosind Invoke-Command, dar știați că puteți folosi Invoke-Command pentru a lansa un job remoting în fundal? Pentru a face acest lucru, pur și simplu adăugați parametrul -AsJob la sfârșitul comenzii dvs.:
Invoke-Command -ComputerName Flash, Viper -Creditor administrator -ScriptBlock gci -AsJob
Aceasta a fost o comandă simplă și ar fi trebuit să fi terminat executarea până acum, așa că vă permite să aruncați o privire la starea noastră de locuri de muncă.
Hmm, pare că a eșuat. Acest lucru mă aduce în primii mei angajați cu locuri de muncă. Când creați o lucrare nouă de orice tip în PowerShell, aceasta creează o sarcină de bază pentru părinți în plus față de o sarcină copil pentru fiecare computer pe care îl executați. Când utilizați cmdlet-ul Get-Job, acesta vă arată numai lucrările părinte și proprietatea de stat este scenariul celui mai rău caz, ceea ce înseamnă că, chiar dacă comanda nu a reușit să ruleze pe una din o sută de computere, a eșuat. Pentru a vedea o listă de lucrări copil, trebuie să utilizați parametrul IncludeChildJob.
Dacă te uiți mai aproape, vei vedea că lucrarea a eșuat într-adevăr într-un singur computer, ceea ce ne aduce în următoarea misiune. Când încercați și obțineți rezultatele pentru lucrare, dacă specificați numele sau ID-ul de activitate al părintelui, PowerShell va returna datele din toate lucrările copilului. Problema este că dacă există o eroare într-una din locurile de muncă pentru copii, vom rămâne cu un text roșu.
Există două modalități de a obține în jurul valorii de acest lucru. În primul rând, dacă știți ce computere doriți pentru rezultate, puteți pur și simplu să utilizați parametrul ComputerName al cmdletului Recieve -Job.
Get-Job-Id 3 | Primiți-Job-Țineți-Vipera de calculator
Alternativ, puteți obține rezultatele dintr-o anumită lucrare de tip copil folosind id-ul de activitate.
Get-Job -Id 3 -IncludeChildJob
Get-Job-Id 5 | Primiți-Job-KEEP
Lucrările WMI sunt cam aceleași ca lucrările la distanță, necesitând adăugarea numai a parametrului -AsJob în cmdletul Get-WmiObject.
Din păcate, acest lucru înseamnă că aceștia sunt, de asemenea, supuși acelorași interese pe care le-am menționat în secțiunea Lucrări la distanță.
Ultimele trei tipuri de locuri de muncă pe care le-am analizat nu au fost persistente, ceea ce înseamnă că acestea sunt disponibile numai în sesiunea curentă. Practic, asta înseamnă că, dacă porniți o slujbă și apoi deschideți o altă consolă PowerShell și rulați Get-Job, nu veți vedea nicio activitate. Cu toate acestea, întoarceți-vă la consola pe care ați dat-o de la locul de muncă, veți putea vedea statutul său. Acest lucru este în contrast cu Jobs programate care sunt persistente. Practic, o lucrare programată este un bloc de script care rulează într-un program. În trecut, aceleași efecte ar fi putut fi obținute prin utilizarea programului Windows Task Scheduler, care este într-adevăr ceea ce se întâmplă sub capotă. Pentru a crea o nouă lucrare programată, facem următoarele:
Înregistrați-programatăJob -Vă primiți GetEventLogs -ScriptBlock Get-EventLog -LogName Securitate -Newest 100 -Trigger (New-JobTrigger -Daily -At 17pm) -ScheduledJobOption (New-ScheduledJobOption -RunElevated)
Se întâmplă destul de mult în comandă, deci haideți să o desființăm.
Deoarece acesta este un tip de activitate ușor diferit, va trebui să folosiți o comandă diferită pentru a prelua o listă a tuturor lucrărilor programate pe o mașină.
Get-ScheduledJob
Cam despre asta e.