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 folyamaton futnak a helyi gépen.PSTaskJob
vagyThreadJob
– 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:
- Leválasztott munkamenetekben futó feladatok létrehozásához használható
Invoke-Command
. További információ: about_Remote_Jobs. - Feladat
Start-Process
helyett új folyamatot hozhat létre. További információ: Start-Process.
A feladatparancsmagok
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 létrehoz egy háttérfeladatot egy távoli számítógépen. Bármely feladatparancsot távolról is futtathatInvoke-Command
, beleértve aStart-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.
Parancs írásához Start-Job
csatolja azt a parancsot, amelyet a feladat kapcsos zárójelben ({}
) futtat. A parancs megadásához használja a ScriptBlock paramétert.
Az alábbi 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 egy változóba mentheti, majd a többi Feladat parancsmaggal együtt 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 Start-Job
előző példában szereplő parancsmag használatával.
$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 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. Egy befejezett feladat kész 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ó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 a változó feladatobjektumával $job
.
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 változóban lévő $job
feladat eredményeit a változóba $results
menti.
$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
lekéri az összes feladat eredményét. 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 feladat eredményeit tárolja. Amikor újra fut Receive-Job
, csak az első futtatás után érkezett új eredmények lesznek.
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 meghatározhatja, hogy mikor fejeződik be a feladat. Az alábbi parancs az objektumot használja az Get-Job
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 az Állapot tulajdonság azt mutatja, hogy a 2. feladat még fut. Ha most 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. Az Állapot tulajdonság használatával á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é válik.
A parancsmaggal Wait-Job
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.
A következő parancs a Wait-Job
parancsmaggal várja meg a 10-ben megadott 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 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 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ővel (|
) küldi el a változóban lévő feladatot a $job
következőnek 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 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, és keresse meg azt a hibát, amely miatt a feladat meghiúsult.
$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óra való Csatlakozás a következő hibaüzenettel meghiúsult: "Hozzáférés megtagadva".