29Aug

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

click fraud protection

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:

  • Învățaț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ățați formaterea, filtrarea și compararea în PowerShell
  • Aflați cum să utilizați Remoting înPowerShell
  • Utilizarea PowerShell pentru a obține informații despre computer
  • Lucrul cu colecții în PowerShell

Și stați pe toată săptămâna pentru restul seriilor.

Lucrări de fundal

Până acum tot ceea ce ți-am arătat în PowerShell a fost sincron, ceea ce înseamnă că 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.

instagram viewer

Start-Job -Name 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 porniți un nou loc de muncă, PowerShell creează un nou obiect de activitate care reprezintă acea sarcină.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ă într-un anumit 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 -Name 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" pentru "Întreținere".

Get-Job -Name GetFileList |Primiți-vă-Ascultați

Odată ce ați terminat cu un loc de muncă, este o practică bună să o eliminați. Pentru a elimina lucrarea, pur și simplu trageți-o în cmdletul Remove-Job.

Get-Job -Name GetFileList |Remove-Job

Aceasta va elimina din lista de lucrări returnate de Get-Job.

Locuri de muncă la distanță

Câteva lecții în urmă, 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 o lucrare 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 -Credențial administrator -ScriptBlock{ gci} -AsJob

A fost o comandă simplă și ar fi trebuit să fi terminat de executat până acumvă 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, doar pe un singur computer, ceea ce ne aduce în următorul gotcha. 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 |Receive-Job -Keep -ComputerName Viper

Alternativ, puteți obține rezultatele dintr-o lucrare specifică copil utilizând id-ul de activitate.

Get-Job-Id 3 -IncludeChildJob

Get-Job -Id 5 |Primirea locului de muncă

WMI Jobs

Lucrările WMI

sunt la fel ca Lucrările la distanță, necesitând adăugarea numai a parametrului -AsJob în cmdletul Get-WmiObject.

Din păcate, aceasta înseamnă că acestea sunt, de asemenea, supuse la aceleași gotchas am menționat în secțiunea Lucrări la distanță.

Lucrări programate

Ultimele trei tipuri de locuri de muncă pe care le-am examinat 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:

Register-ScheduledJob -Name GetEventLogs -ScriptBlock{ Get-EventLog -LogName Securitate -Newest 100} -Trigger( New-JobTrigger -Daily -At 17pm) -ScheduledJobOption( New-ScheduledJobOption-RunElevated)

Se face destul de mult în acea comandă, așa că haideți să o rupem.

  • Mai întâi, oferim jobului nostru programat un nume de GetEventLogs.
  • Atunci, spunem că atunci când este declanșat, dorim ca acesta să ruleze conținutul blocului de script specificat, care primește cel mai nou 100 de intrări din jurnalul de evenimente de securitate.
  • Mai jos, 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

Asta e tot ce este acolo.