Megosztás a következőn keresztül:


about_Jobs

Rövid leírás

Információt nyújt arról, hogy a PowerShell háttérfeladatai hogyan futtatnak parancsot vagy kifejezést a háttérben az aktuális munkamenet használata nélkül.

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 munkameneten 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 nem érintik a többi futó feladatot vagy a feladatot kezdő szülőmunkamenetet. Az újraegyeztetési réteg azonban többletterhelést okoz, beleértve az objektumszerializálást is. Minden objektum szerializálva és deszerializálva lesz, ahogy a szülő munkamenet és a távoli (feladat)munkamenet között kerülnek átadásra. 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 továbbíthat 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 egy feladat kritikus hibát jelez, amely összeomlik a folyamat során, akkor a folyamat összes többi feladata leáll.

A szálalapú feladatok azonban kevesebb többletterhelést igényelnek. Nem használják az átnevezési réteget vagy a szerializálást. Az eredményobjektumok az aktuális munkamenetben élő objektumokra mutató hivatkozásokként jelennek meg. 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 is figyeli a feladat állapotát, és összegyűjti a folyamatadatokat. A feladat gyermekfolyamatát a szülőfolyamat leállítja, amint a feladat befejeződött. Ha a szülő munkamenet le van állítva, a rendszer az összes futó gyermekfeladatot leállítja a gyermekfolyamatokkal együtt.

Kétféleképpen lehet megkerülni ezt a helyzetet:

  1. A leválasztott munkamenetekben futó feladatok létrehozásához használja a Invoke-Command. További információ: about_Remote_Jobs.
  2. A Start-Process használatával feladat helyett új folyamatot hozhat létre. További információ: Folyamat indítása.

A feladatparancsmagok

  • Start-Job – Háttérfeladat indítása 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 létrehoz egy háttérfeladatot egy távoli számítógépen. A Invoke-Command használatával bármilyen feladatparancsot futtathat távolról, beleértve a Start-Job.

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

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

Ha Start-Job parancsot szeretne írni, csatolja azt a parancsot, amelyet a feladat kapcsos zárójelekbe ({}) futtat. A parancs megadásához használja a ScriptBlock paramétert.

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, a feladatot jelképező objektumot ad vissza. A feladatobjektum hasznos információkat tartalmaz a feladatról, de nem tartalmazza a feladat eredményeit.

A feladatobjektumot mentheti egy változóba, majd a többi Feladat parancsmaggal kezelheti a háttérfeladatot. Az alábbi 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ér operátor használata funkcionálisan egyenértékű az előző példában szereplő Start-Job 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 nélkül Get-Job az aktuális munkamenetben elindított összes feladatot adja vissza.

Get-Job

A feladatobjektum tartalmazza a feladat állapotát, amely jelzi, hogy a feladat befejeződött-e. A befejezett feladatok állapota Befejezett vagy Sikertelen. Előfordulhat, hogy egy feladat Letiltva vagy Futó.

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

A feladatobjektumot mentheti egy változóba, és egy későbbi parancsban is képviselheti a feladatot. Az alábbi parancs lekéri a feladatot az 1- azonosítóval, é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. Egy 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 az $job változóban lévő 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
...

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

$results = Receive-Job -Job $job

Részleges feladatok eredményeinek 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 megkapja az összes feladat eredményét. Ha a feladat még 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 Receive-Job törli az eredményeket a gyorsítótárból, ahol a feladat eredményeit tárolja. Amikor újra futtatja Receive-Job, csak az első futtatás után érkezett új eredményeket kapja.

Az alábbi parancsok a feladat befejezése előtt futtatott Receive-Job parancsok eredményeit 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, hogy Receive-Job törölje a visszaadott feladateredményeket. Az alábbi parancsok a Keep paraméter egy még nem befejezett feladatra gyakorolt hatását mutatják be.

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 meghatározhatja, hogy mikor fejeződik be a feladat. Az alábbi parancs a Get-Job objektumot használja az aktuális munkamenet összes háttérfeladatának lekéréséhez.

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 a Receive-Job parancsmaggal szeretné lekérni a feladat eredményeit, az eredmények hiányosak lesznek. 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 parancsot is használhatja Receive-Job -Wait . 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é válik.

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

Wait-Job -Id 10

Ennek eredményeképpen a PowerShell-kérés mindaddig el lesz tiltva, amíg a feladat be nem fejeződik.

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

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. Az alábbi parancs elindít egy feladatot a rendszer eseménynaplójának minden bejegyzésének lekéréséhez. 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. Egy folyamatkezelőt (|) használ a $job változóban lévő feladat Stop-Job.

$job | Stop-Job

Feladat törlése

Háttérfeladat törléséhez használja a Remove-Job parancsmagot. Az alábbi parancs törli a feladatot a $job változóban.

Remove-Job -Job $job

Sikertelen feladat vizsgálata

A feladatok több okból is meghiúsulhatnak. a feladatobjektum egy Ok tulajdonságot tartalmaz, 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 a 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épen explicit hitelesítő adatokra volt szükség 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: