Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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. -
PSTaskJobvagyThreadJob– 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:
- A leválasztott munkamenetekben futó feladatok létrehozásához használja a
Invoke-Command. További információ: about_Remote_Jobs. - A
Start-Processhaszná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. AInvoke-Commandhasználatával bármilyen feladatparancsot futtathat távolról, 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.
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".