Pagina principala » HOWTO » 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

    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ățarea de a folosi Cmdlets în PowerShell
    • Învățați cum să utilizați obiecte în PowerShell
    • Formatul de învățare, 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 pe toată săptămâna pentru restul seriei.

    Lucrări de fundal

    Până acum, tot 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 execuția. Aici intră lucrările 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 execută în fundal.

    Când lansaț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 cmdletul Get-Job.

    Obiectele de lucru vă informează despre starea lucrărilor. De exemplu, în captura de ecran de mai sus vedem că avem un BackgroundJob numit GetFileList, care încă mai rulează, dar deja a început 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 primit până când punctul în care ați oprit-o este încă disponibil. Totuși, există un gotcha. Î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-întreținere".

    Get-Job - Numele GetFileList | Primiți-Job-Keep

    Odată ce ați terminat cu 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 o lucrare remoting în fundal? Pentru a face acest lucru, pur și simplu adăugați parametrul -AsJob la sfârșitul comenzii dvs.:

    Invocare-Comandă -ComputerName Flash, Viper -Credențială 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 pe primul meu gotcha 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 lucrare de copil pentru fiecare computer pe care îl executați. Când utilizați cmdletul Get-Job, acesta vă arată numai lucrările părinte și proprietatea de stat este scenariul cel mai rău caz, ceea ce înseamnă că, chiar dacă comanda nu a reușit să ruleze pe una din sutele de computere, starea de sarcini părinte va spune 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 acest lucru. În primul rând, dacă știți la ce computere doriți rezultatele, puteți pur și simplu utiliza parametrul ComputerName al cmcletului 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 utilizând 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 la fel la fel ca lucrările la distanță, necesitând adăugarea numai a parametrului -AsJob în cmdletul Get-WmiObject.

    Din păcate, acest lucru înseamnă că acestea sunt, de asemenea, supuse 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 examinat nu au fost persistente, ceea ce înseamnă că acestea sunt disponibile numai în sesiunea curentă. Practic, asta inseamna ca daca incepeti un job si apoi deschideti o alta Consola PowerShell si rulati Get-Job, nu veti vedea nici o slujba. 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, același efect ar fi putut fi obținut utilizând Planificatorul de sarcini Windows, care este într-adevăr ceea ce se întâmplă sub capota. Pentru a crea o nouă lucrare programată, facem următoarele:

    Înregistrați-programatăJob -Vă primiți GetEventLogs -ScriptBlock Get-EventLog -LogName Security -Newest 100 -Trigger (New-JobTrigger -Daily -At 17pm) -ScheduledJobOption (New-ScheduledJobOption -RunElevated)

    Se întâmplă destul de mult în comanda aceea, deci haideți să o desființăm.

    • În primul rând, oferim un loc de muncă programat numele nostru de GetEventLogs.
    • Apoi, spunem că atunci când este declanșat, dorim ca acesta să ruleze conținutul blocului script specificat, care primește cel mai nou 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 de declanșare, 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 evenimentelor, 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, de asemenea, 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.