about_Jobs

Rövid leírás

Információt nyújt arról, hogy a PowerShell háttérfeladatai hogyan futtatnak parancsokat vagy kifejezéseket a háttérben anélkül, hogy az aktuális munkamenettel kommunikálna.

Hosszú leírás

A PowerShell egyszerre futtat parancsokat és szkripteket a feladatokon keresztül. A PowerShell három feladattípust biztosít az egyidejűség támogatásához.

  • RemoteJob – A parancsok és szkriptek távoli munkamenetben futnak. További információ: about_Remote_Jobs.
  • BackgroundJob – A parancsok és szkriptek külön folyamatban futnak a helyi gépen.
  • PSTaskJob vagy ThreadJob – A parancsok és szkriptek külön szálon futnak ugyanazon a folyamaton belül a helyi gépen. További információ: about_Thread_Jobs.

A szkriptek távoli, külön gépen vagy külön folyamatban történő futtatása nagy elkülönítést biztosít. A távoli feladatban előforduló hibák nincsenek hatással a többi futó feladatra vagy a feladatot elindító szülő munkamenetre. A remoting réteg azonban többletterhelést okoz, beleértve az objektum szerializálását is. A rendszer szerializálja és deszerializálja az összes objektumot a szülő- és a távoli (feladat-) munkamenet között. A nagy méretű, összetett adatobjektumok szerializálása nagy mennyiségű számítási és memória-erőforrást használhat fel, és nagy mennyiségű adatot vihet át a hálózaton.

A szálalapú feladatok nem olyan robusztusak, mint a távoli és a háttérfeladatok, mivel ugyanabban a folyamatban futnak különböző szálakon. Ha az egyik feladat kritikus hibát jelez, amely a folyamatot összeomlja, akkor a folyamat összes többi feladata leáll.

A szálalapú feladatok azonban kevesebb többletterhelést igényelnek. Nem használják a remoting réteget vagy szerializálást. A rendszer az eredményobjektumokat az aktuális munkamenetben élő objektumokra mutató hivatkozásként adja vissza. E többletterhelés nélkül a szálalapú feladatok gyorsabban futnak, és kevesebb erőforrást használnak, mint a többi feladattípus.

Fontos

A feladatot létrehozó szülőmunkamenet a feladat állapotát is figyeli, és folyamatadatokat gyűjt. A feladat gyermekfolyamatát a szülőfolyamat leállítja, amint a feladat befejezett állapotba kerül. Ha a szülő-munkamenet le van állítva, a gyermekfolyamatokkal együtt az összes futó gyermekfeladat le lesz állítva.

Ezt a helyzetet kétféleképpen lehet megkerülni:

  1. Leválasztott munkamenetekben futó feladatok létrehozásához használható Invoke-Command . További információ: about_Remote_Jobs.
  2. Feladat helyett új folyamat létrehozására használható Start-Process . További információ: Start-Process.

A feladat parancsmagjai

  • Start-Job – Elindít egy háttérfeladatot egy helyi számítógépen.
  • Get-Job – Lekéri az aktuális munkamenetben elindított háttérfeladatokat.
  • Receive-Job - Lekéri a háttérfeladatok eredményeit.
  • Stop-Job - Leállítja a háttérfeladatot.
  • Wait-Job – Letiltja a parancssort, amíg egy vagy az összes feladat be nem fejeződik.
  • Remove-Job – Háttérfeladat törlése.
  • Invoke-Command – Az AsJob paraméter háttérfeladatot hoz létre egy távoli számítógépen. Bármilyen feladatparancsot futtathat Invoke-Command távolról, beleértve a Start-Job.

Feladat indítása a helyi számítógépen

Ha háttérfeladatot szeretne indítani a helyi számítógépen, használja a Start-Job parancsmagot.

Parancs írásához Start-Job foglalja a feladat által futtatott parancsot kapcsos zárójelek ({}) között. A parancsot a ScriptBlock paraméter használatával adhatja meg.

A következő parancs elindít egy háttérfeladatot, amely egy Get-Process parancsot futtat a helyi számítógépen.

Start-Job -ScriptBlock {Get-Process}

Háttérfeladat indításakor a parancssor azonnal visszatér, még akkor is, ha a feladat végrehajtása hosszabb időt vesz igénybe. A munkamenetben megszakítás nélkül folytathatja a munkát, amíg a feladat fut.

A Start-Job parancs egy objektumot ad vissza, amely a feladatot jelöli. A feladatobjektum hasznos információkat tartalmaz a feladatról, de nem tartalmazza a feladat eredményeit.

A feladatobjektumot mentheti egy változóban, majd a többi Feladat parancsmaggal együtt használhatja a háttérfeladat kezeléséhez. A következő parancs elindít egy feladatobjektumot, és menti az eredményként kapott feladatobjektumot a $job változóba.

$job = Start-Job -ScriptBlock {Get-Process}

A PowerShell 6.0-tól kezdve a folyamat végén található háttéroperátor (&) használatával elindíthat egy háttérfeladatot. További információ: háttéroperátor.

A háttéroperátor használata funkcionálisan egyenértékű az Start-Job előző példában használt parancsmaggal.

$job = Get-Process &

Feladatobjektumok lekérése

A Get-Job parancsmag olyan objektumokat ad vissza, amelyek az aktuális munkamenetben elindított háttérfeladatokat jelölik. Paraméterek Get-Job nélkül visszaadja az aktuális munkamenetben elindított összes feladatot.

Get-Job

A feladatobjektum tartalmazza a feladat állapotát, amely azt jelzi, hogy a feladat befejeződött-e. Egy befejezett feladat befejezett vagy sikertelen állapotú. Előfordulhat, hogy egy feladat le van tiltva vagy fut.

Id  Name  PSJobTypeName State      HasMoreData  Location   Command
--  ----  ------------- -----      -----------  --------   -------
1   Job1  BackgroundJob Complete   True         localhost  Get-Process

A feladatobjektumot mentheti egy változóban, és felhasználhatja a feladat egy későbbi parancsban való ábrázolására. A következő parancs lekéri az 1- azonosítójú feladatot, és menti a $job változóba.

$job = Get-Job -Id 1

Feladat eredményeinek lekérése

Háttérfeladat futtatásakor az eredmények nem jelennek meg azonnal. Háttérfeladat eredményeinek lekéréséhez használja a Receive-Job parancsmagot.

Az alábbi példában a Receive-Job parancsmag lekéri a feladat eredményeit a változóban lévő $job feladatobjektum használatával.

Receive-Job -Job $job
Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)    Id ProcessName
-------  ------    -----      ----- -----   ------    -- -----------
    103       4    11328       9692    56           1176 audiodg
    804      14    12228      14108   100   101.74  1740 CcmExec
    668       7     2672       6168   104    32.26   488 csrss
...

A feladat eredményeit egy változóba mentheti. Az alábbi parancs a változóban lévő $job feladat eredményeit a $results változóba menti.

$results = Receive-Job -Job $job

Részleges feladateredmények lekérése és megtartása

A Receive-Job parancsmag lekéri egy háttérfeladat eredményeit. Ha a feladat befejeződött, Receive-Job lekéri az összes találatot. Ha a feladat továbbra is fut, Receive-Job lekéri az eddig létrehozott eredményeket. A fennmaradó eredmények lekéréséhez ismét futtathat Receive-Job parancsokat.

Alapértelmezés szerint törli az eredményeket a gyorsítótárból, Receive-Job ahol a feladateredmények találhatók. Amikor ismét futtat Receive-Job , csak az első futtatás után érkezett új eredményeket kapja meg.

Az alábbi parancsok a feladat befejezése előtt futtatott parancsok eredményeit Receive-Job mutatják.

C:\PS> Receive-Job -Job $job

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    103       4    11328       9692    56            1176 audiodg
    804      14    12228      14108   100   101.74   1740 CcmExec

C:\PS> Receive-Job -Job $job

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    68       3     2632        664    29     0.36   1388 ccmsetup
   749      22    21468      19940   203   122.13   3644 communicator
   905       7     2980       2628    34   197.97    424 csrss
  1121      25    28408      32940   174   430.14   3048 explorer

A Keep paraméter használatával megakadályozhatja Receive-Job a visszaadott feladateredmények törlését. Az alábbi parancsok azt mutatják be, hogy a Keep paramétert egy még nem befejezett feladatra kell használni.

C:\PS> Receive-Job -Job $job -Keep

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    103       4    11328       9692    56            1176 audiodg
    804      14    12228      14108   100   101.74   1740 CcmExec

C:\PS> Receive-Job -Job $job -Keep

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    103       4    11328       9692    56            1176 audiodg
    804      14    12228      14108   100   101.74   1740 CcmExec
     68       3     2632        664    29     0.36   1388 ccmsetup
    749      22    21468      19940   203   122.13   3644 communicator
    905       7     2980       2628    34   197.97    424 csrss
   1121      25    28408      32940   174   430.14   3048 explorer

Várakozás az eredményekre

Ha olyan parancsot futtat, amely hosszú időt vesz igénybe, a feladatobjektum tulajdonságaival megállapíthatja, hogy mikor fejeződik be a feladat. Az alábbi parancs az Get-Job objektum használatával lekéri az aktuális munkamenet összes háttérfeladatát.

Get-Job

Az eredmények egy táblázatban jelennek meg. A feladat állapota megjelenik az Állapot oszlopban.

Id Name  PSJobTypeName State    HasMoreData Location  Command
-- ----  ------------- -----    ----------- --------  -------
1  Job1  BackgroundJob Complete True        localhost Get-Process
2  Job2  BackgroundJob Running  True        localhost Get-EventLog -Log ...
3  Job3  BackgroundJob Complete True        localhost dir -Path C:\* -Re...

Ebben az esetben a State tulajdonság azt mutatja, hogy a 2. feladat még fut. Ha most a Receive-Job parancsmagot használná a feladat eredményeinek lekéréséhez, az eredmények hiányosak lennének. A parancsmagot többször is használhatja Receive-Job az összes eredmény lekéréséhez. A State tulajdonság segítségével állapítsa meg, hogy mikor fejeződik be a feladat.

A parancsmag Wait paraméterét Receive-Job is használhatja. Ha ezt a paramétert használja, a parancsmag nem adja vissza a parancssort, amíg a feladat be nem fejeződik, és az összes eredmény elérhetővé nem válik.

A parancsmaggal Wait-Job megvárhatja a feladat bármely vagy az összes eredményét. Wait-Job A lehetővé teszi, hogy egy vagy több konkrét feladatra vagy az összes feladatra várjon. A következő parancs a Wait-Job parancsmaggal várja meg a 10-edik azonosítójú feladatot.

Wait-Job -ID 10

Ennek eredményeképpen a PowerShell-parancssor el lesz rejtve, amíg a feladat be nem fejeződik.

Az előre meghatározott időtartamot is megvárhatja. Ez a parancs az Időtúllépés paraméter használatával korlátozza a várakozást 120 másodpercre. Amikor lejár az idő, a parancssor visszatér, de a feladat továbbra is fut a háttérben.

Wait-Job -ID 10 -Timeout 120

Feladat leállítása

Háttérfeladat leállításához használja a Stop-Job parancsmagot. A következő parancs elindít egy feladatot, amely lekér minden bejegyzést a rendszer eseménynaplójában. Menti a feladatobjektumot a $job változóba.

$job = Start-Job -ScriptBlock {Get-EventLog -Log System}

A következő parancs leállítja a feladatot. Folyamatoperátort (|) használ a változóban lévő feladat elküldéséhezStop-Job.$job

$job | Stop-Job

Feladat törlése

Háttérfeladat törléséhez használja a Remove-Job parancsmagot. A következő parancs törli a feladatot a $job változóból.

Remove-Job -Job $job

Sikertelen feladat kivizsgálása

A feladatok több okból is meghiúsulhatnak. A feladatobjektum tartalmaz egy Ok tulajdonságot, amely a hiba okával kapcsolatos információkat tartalmaz.

Az alábbi példa egy feladatot indít el a szükséges hitelesítő adatok nélkül.

$job = Start-Job -ScriptBlock {New-Item -Path HKLM:\Software\MyCompany}
Get-Job $job

Id Name  PSJobTypeName State  HasMoreData  Location  Command
-- ----  ------------- -----  -----------  --------  -------
1  Job1  BackgroundJob Failed False        localhost New-Item -Path HKLM:...

Vizsgálja meg az Ok tulajdonságot a feladat meghiúsulását okozó hiba megkereséséhez.

$job.ChildJobs[0].JobStateInfo.Reason

Ebben az esetben a feladat meghiúsult, mert a távoli számítógépnek explicit hitelesítő adatokra volt szüksége a parancs futtatásához. Az Ok tulajdonság a következő üzenetet tartalmazza:

A távoli kiszolgálóhoz való csatlakozás a következő hibaüzenettel meghiúsult: "Hozzáférés megtagadva".

Lásd még