about_Jobs
Kısa açıklama
PowerShell arka plan işlerinin geçerli oturumla etkileşim kurmadan arka planda bir komut veya ifadeyi nasıl çalıştıracakları hakkında bilgi sağlar.
Uzun açıklama
PowerShell, komutları ve betikleri işler aracılığıyla eşzamanlı olarak çalıştırır. Eşzamanlılığı desteklemek için PowerShell tarafından sağlanan üç iş türü vardır.
RemoteJob
- Komutlar ve betikler uzak oturumda çalışır. Bilgi için bkz . about_Remote_Jobs.BackgroundJob
- Komutlar ve betikler yerel makinede ayrı bir işlemde çalıştırılır.PSTaskJob
orThreadJob
- Komutlar ve betikler, yerel makinede aynı işlem içinde ayrı bir iş parçacığında çalışır. Daha fazla bilgi için bkz . about_Thread_Jobs.
Betikleri uzaktan, ayrı bir makinede veya ayrı bir işlemde çalıştırmak harika yalıtım sağlar. Uzak işte oluşan hatalar, diğer çalışan işleri veya işi başlatan üst oturumu etkilemez. Ancak uzaktan iletişim katmanı, nesne serileştirme de dahil olmak üzere ek yük ekler. Tüm nesneler, üst oturum ile uzak (iş) oturum arasında geçirildikçe seri hale getirilir ve seri durumdan çıkarılır. Büyük karmaşık veri nesnelerinin seri hale getirilmesi büyük miktarda işlem ve bellek kaynağı tüketebilir ve büyük miktarda veriyi ağ üzerinden aktarabilir.
İş parçacığı tabanlı işler, farklı iş parçacıklarında aynı işlemde çalıştırıldığından uzak ve arka plan işleri kadar sağlam değildir. Bir işin işlemi kilitleyen kritik bir hatası varsa, işlemdeki diğer tüm işler sonlandırılır.
Ancak iş parçacığı tabanlı işler daha az ek yük gerektirir. Uzaktan iletişim katmanını veya serileştirmeyi kullanmaz. Sonuç nesneleri geçerli oturumdaki canlı nesnelere başvuru olarak döndürülür. Bu ek yük olmadan, iş parçacığı tabanlı işler daha hızlı çalışır ve diğer iş türlerinden daha az kaynak kullanır.
Önemli
İşi oluşturan üst oturum da iş durumunu izler ve işlem hattı verilerini toplar. İş tamamlanmış duruma ulaştığında, iş alt işlemi üst işlem tarafından sonlandırılır. Üst oturum sonlandırılırsa, çalışan tüm alt işler kendi alt işlemleriyle birlikte sonlandırılır.
Bu durumu geçici olarak gidermenin iki yolu vardır:
- Bağlantısız oturumlarda çalışan işler oluşturmak için kullanın
Invoke-Command
. Daha fazla bilgi için bkz . about_Remote_Jobs. - İş yerine yeni bir işlem oluşturmak için kullanın
Start-Process
. Daha fazla bilgi için bkz . Start-Process.
İş cmdlet'leri
Start-Job
- Yerel bilgisayarda bir arka plan işi başlatır.Get-Job
- Geçerli oturumda başlatılan arka plan işlerini alır.Receive-Job
- Arka plan işlerinin sonuçlarını alır.Stop-Job
- Arka plan işini durdurur.Wait-Job
- Bir veya tüm işler tamamlanana kadar komut istemini gizler.Remove-Job
- Arka plan işini siler.Invoke-Command
- AsJob parametresi uzak bilgisayarda bir arka plan işi oluşturur. dahil olmak üzereStart-Job
herhangi bir iş komutunu uzaktan çalıştırmak için kullanabilirsinizInvoke-Command
.
Yerel bilgisayarda bir iş başlatma
Yerel bilgisayarda bir arka plan işi başlatmak için cmdlet'ini Start-Job
kullanın.
Komut Start-Job
yazmak için, işin çalıştığı komutu küme ayraçları ({}
içinde) içine alın. Komut belirtmek için ScriptBlock parametresini kullanın.
Aşağıdaki komut, yerel bilgisayarda bir komut çalıştıran bir Get-Process
arka plan işi başlatır.
Start-Job -ScriptBlock {Get-Process}
Bir arka plan işi başlattığınızda, işin tamamlanması uzun sürse bile komut istemi hemen döner. İş çalışırken oturumda kesintisiz olarak çalışmaya devam edebilirsiniz.
komutu, Start-Job
işi temsil eden bir nesne döndürür. İş nesnesi iş hakkında yararlı bilgiler içerir, ancak iş sonuçlarını içermez.
İş nesnesini bir değişkene kaydedebilir ve arka plan işini yönetmek için diğer İş cmdlet'leriyle birlikte kullanabilirsiniz. Aşağıdaki komut bir iş nesnesi başlatır ve sonuçta elde edilen iş nesnesini değişkene $job
kaydeder.
$job = Start-Job -ScriptBlock {Get-Process}
PowerShell 6.0'da başlayarak, bir arka plan işi başlatmak için işlem hattının sonundaki arka plan işlecini (&
) kullanabilirsiniz. Daha fazla bilgi için bkz . arka plan işleci.
Arka plan işlecini kullanmak, önceki örnekteki Start-Job
cmdlet'i kullanmaya işlevsel olarak eşdeğerdir.
$job = Get-Process &
İş nesnelerini alma
Cmdlet, Get-Job
geçerli oturumda başlatılan arka plan işlerini temsil eden nesneleri döndürür. Parametreler olmadan, Get-Job
geçerli oturumda başlatılan tüm işleri döndürür.
Get-Job
İş nesnesi, işin durumunu içerir ve bu da işin tamamlanıp tamamlanmadığını gösterir. Tamamlanmış bir işin durumu Tamamlandı veya Başarısız oldu. Bir iş De Engellendi veya Çalışıyor olabilir.
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Complete True localhost Get-Process
İş nesnesini bir değişkene kaydedebilir ve daha sonraki bir komutta işi temsil etmek için kullanabilirsiniz. Aşağıdaki komut, kimliği 1 olan işi alır ve değişkene $job
kaydeder.
$job = Get-Job -Id 1
bir işin sonuçlarını alma
Arka plan işi çalıştırdığınızda sonuçlar hemen görünmez. Arka plan işinin sonuçlarını almak için cmdlet'ini Receive-Job
kullanın.
Aşağıdaki örnekte Receive-Job
, cmdlet değişkenindeki iş nesnesini $job
kullanarak işin sonuçlarını alır.
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
...
Bir işin sonuçlarını bir değişkene kaydedebilirsiniz. Aşağıdaki komut, değişkenindeki işin $job
sonuçlarını değişkenine $results
kaydeder.
$results = Receive-Job -Job $job
Kısmi iş sonuçlarını alma ve tutma
Receive-Job
Cmdlet bir arka plan işinin sonuçlarını alır. İş tamamlandıysa, Receive-Job
tüm iş sonuçlarını alır. İş hala çalışıyorsa, Receive-Job
şimdiye kadar oluşturulan sonuçları alır. Kalan sonuçları almak için komutları yeniden çalıştırabilirsiniz Receive-Job
.
Varsayılan olarak, Receive-Job
sonuçları iş sonuçlarının depolandığı önbellekten siler. Yeniden çalıştırdığınızda Receive-Job
, yalnızca ilk çalıştırmadan sonra gelen yeni sonuçları alırsınız.
Aşağıdaki komutlar, iş tamamlanmadan önce çalıştırılacak komutların sonuçlarını Receive-Job
gösterir.
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
Döndürülen iş sonuçlarının silinmesini önlemek Receive-Job
için Keep parametresini kullanın. Aşağıdaki komutlar, Henüz tamamlanmamış bir iş üzerinde Keep parametresinin kullanılmasının etkisini gösterir.
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
Sonuçlar bekleniyor
Tamamlanması uzun süren bir komut çalıştırırsanız, işin ne zaman tamamlandığını belirlemek için iş nesnesinin özelliklerini kullanabilirsiniz. Aşağıdaki komut, geçerli oturumdaki Get-Job
tüm arka plan işlerini almak için nesnesini kullanır.
Get-Job
Sonuçlar bir tabloda görünür. İşin durumu State sütununda görünür.
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...
Bu durumda, State özelliği İş 2'nin hala çalıştığını gösterir. İş sonuçlarını şimdi almak için cmdlet'ini kullanırsanız Receive-Job
sonuçlar tamamlanmamış olur. Tüm sonuçları almak için cmdlet'ini art arda kullanabilirsiniz Receive-Job
. İşin ne zaman tamamleneceğini belirlemek için State özelliğini kullanın.
Cmdlet'in Wait parametresini Receive-Job
de kullanabilirsiniz. Bu parametreyi kullandığınızda, cmdlet iş tamamlanana ve tüm sonuçlar kullanılabilir olana kadar komut istemini döndürmez.
İşin sonuçlarının Wait-Job
herhangi birini veya tümünü beklemek için cmdlet'ini de kullanabilirsiniz. Wait-Job
bir veya daha fazla belirli iş veya tüm işler için beklemenize olanak tanır.
Aşağıdaki komut, kimliği 10 olan bir işi beklemek için cmdlet'ini kullanırWait-Job
.
Wait-Job -ID 10
Sonuç olarak, iş tamamlanana kadar PowerShell istemi gösterilmez.
Önceden belirlenmiş bir süre de bekleyebilirsiniz. Bu komut, beklemeyi 120 saniyeyle sınırlamak için Timeout parametresini kullanır. Süre dolduğunda komut istemi geri döner, ancak iş arka planda çalışmaya devam eder.
Wait-Job -ID 10 -Timeout 120
İşi durdurma
Arka plan işini durdurmak için cmdlet'ini Stop-Job
kullanın. Aşağıdaki komut, Sistem olay günlüğündeki her girişi almak için bir iş başlatır. İş nesnesini değişkene $job
kaydeder.
$job = Start-Job -ScriptBlock {Get-EventLog -Log System}
Aşağıdaki komut işi durdurur. değişkenindeki $job
Stop-Job
işi adresine göndermek için bir işlem hattı işleci (|
) kullanır.
$job | Stop-Job
İşi silme
Bir arka plan işini silmek için cmdlet'ini Remove-Job
kullanın. Aşağıdaki komut değişkendeki $job
işi siler.
Remove-Job -Job $job
Başarısız bir işi araştırma
İşler birçok nedenle başarısız olabilir. iş nesnesi, hatanın nedeni hakkında bilgi içeren bir Reason özelliği içerir.
Aşağıdaki örnek, gerekli kimlik bilgileri olmadan bir iş başlatır.
$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:...
İşin başarısız olmasına neden olan hatayı bulmak için Reason özelliğini inceleyin.
$job.ChildJobs[0].JobStateInfo.Reason
Bu durumda, uzak bilgisayar komutu çalıştırmak için açık kimlik bilgileri gerektirdiğinden iş başarısız oldu. Reason özelliği aşağıdaki iletiyi içerir:
Uzak sunucuya bağlanma şu hata iletisiyle başarısız oldu: "Erişim reddedildi".
Ayrıca bkz.
PowerShell