If-Koubou

Geek School: Aflați cum să utilizați locuri de muncă în PowerShell

Geek School: Aflați cum să utilizați locuri de muncă în PowerShell (Cum să)

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:

  • Aflați cum să automatizați Windows cu PowerShell
  • Învățați să utilizați Cmdlets în PowerShell
  • Învățați cum să utilizați obiecte în PowerShell
  • Învățarea formatării, filtrarea și compararea în PowerShell
  • Aflați cum să utilizați Remoting în PowerShell
  • Folosind PowerShell pentru a obține informații despre computer
  • Lucrul cu colecțiile din PowerShell

Și stați liniștit pentru restul seriei toată săptămâna.

Lucrări de bază

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.

Lucrări la distanță

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

Locuri de muncă WMI

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ță.

Joburi programate

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.

  • Mai întâi, oferim Jobului nostru programat un nume de GetEventLogs.
  • Apoi, spunem că atunci când este declanșat, dorim ca acesta să ruleze conținutul blocului de script specificat, care primește în mod normal cele mai noi 100 de intrări din jurnalul de evenimente de securitate.
  • Apoi, specificăm un declanșator.Deoarece parametrul de declanșare are ca obiect un obiect declanșator, am folosit o comandă paranteză pentru a genera un declanșator care va dispărea în fiecare zi la 5PM.
  • Deoarece avem de-a face cu jurnalul de evenimente, trebuie să fim ca administrator, pe care îl putem specifica prin crearea unui nou obiect ScheduledJobOption și trecerea acestuia la parametrul ScheduledJobOption.

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.