İşler hakkında
Kısa açıklama
PowerShell arka plan işlerinin, geçerli oturumla etkileşime girmeden arka planda bir komutu veya ifadeyi nasıl çalıştırdığına ilişkin bilgi sağlar.
Uzun açıklama
PowerShell, işler aracılığıyla komutları ve komut dosyalarını aynı anda çalıştırır. Eşzamanlılığı desteklemek için PowerShell tarafından sağlanan üç iş türü vardır.
RemoteJob- Komutlar ve komut dosyaları uzak bir oturumda çalıştırılır. Bilgi için bkz. about_Remote_Jobs.BackgroundJob- Komutlar ve komut dosyaları, yerel makinede ayrı bir işlemde çalıştırılır.PSTaskJobveyaThreadJob- Komutlar ve komut dosyaları, yerel makinede aynı işlem içinde ayrı bir iş parçacığında çalıştırılır. Daha fazla bilgi için bkz. about_Thread_Jobs.
Komut dosyalarını uzaktan, ayrı bir makinede veya ayrı bir süreçte çalıştırmak, mükemmel izolasyon sağlar. Uzak işte meydana gelen hatalar, çalışan diğer işleri veya işi başlatan üst oturumu etkilemez. Ancak uzaktan iletişim katmanı, nesne serileştirmesi de dahil olmak üzere ek yük ekler. Tüm nesneler ana oturum ile uzak (iş) oturumu arasında aktarılırken serileştirilir ve seri durumdan çıkarılır. Büyük karmaşık veri nesnelerinin serileştirilmesi, büyük miktarda bilgi işlem ve bellek kaynağı tüketebilir ve ağ üzerinden büyük miktarda veri aktarabilir.
İş parçacığı tabanlı işler, farklı iş parçacıklarında aynı süreçte çalıştıkları için uzak ve arka plan işleri kadar sağlam değildir. Bir işte, süreci çökerten kritik bir hata varsa, süreçteki 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 kullanmazlar. Sonuç nesneleri, geçerli oturumdaki canlı nesnelere referans olarak döndürülür. Bu ek yük olmadan iş parçacığı tabanlı işler diğer iş türlerine göre daha hızlı çalışır ve daha az kaynak kullanır.
Bu önemli
İşi oluşturan üst oturum aynı zamanda iş durumunu izler ve ardışık düzen verilerini toplar. İş bitmiş duruma ulaştığında, iş alt süreci ana süreç tarafından sonlandırılır. Ana oturum sonlandırılırsa çalışan tüm alt işler, alt süreçleriyle birlikte sonlandırılır.
Bu durumu çözmenin iki yolu vardır:
- Bağlantısı olmayan oturumlarda çalışan işler oluşturmak için
Invoke-Command'ı kullanın. Daha fazla bilgi için bkz. about_Remote_Jobs. - Bir iş yerine yeni bir süreç oluşturmak için
İşlemi Başlat'ı kullanın. Daha fazla bilgi için bkz. İşlem Başlatma.
İş 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.İşi Durdur- Bir arka plan işini durdurur.Wait-Job- Bir iş veya tüm işler tamamlanana kadar komut istemini gizler.Remove-Job- Bir arka plan işini siler.Invoke-Command- AsJob parametresi uzak bilgisayarda bir arka plan işi oluşturur.Start-Jobda dahil olmak üzere herhangi bir iş komutunu uzaktan çalıştırmak içinInvoke-Command'ı kullanabilirsiniz.
Yerel bilgisayarda bir işe nasıl başlanır
Yerel bilgisayarda bir arka plan işi başlatmak için Start-Job cmdlet'ini kullanın.
Bir İşi Başlat komutu yazmak için, işin çalıştığı komutu küme parantezleri ({) içine alın. Komutu belirtmek için ScriptBlock parametresini kullanın.
Aşağıdaki komut, yerel bilgisayarda Get-Process komutunu çalıştıran bir 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 geri döner. İş çalışırken oturumda kesintisiz olarak çalışmaya devam edebilirsiniz.
Start-Job komutu, 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 ardından arka plan işini yönetmek için onu diğer İş cmdlet'leriyle birlikte kullanabilirsiniz. Aşağıdaki komut bir iş nesnesini başlatır ve elde edilen iş nesnesini $job değişkenine kaydeder.
$job = Start-Job -ScriptBlock {Get-Process}
PowerShell 6,0'dan başlayarak, bir arka plan işi başlatmak için ardışık düzenin sonunda arka plan operatörünü (&) kullanabilirsiniz. Daha fazla bilgi için bkz. arka plan operatörü.
Arka plan operatörünü kullanmak, işlevsel olarak önceki örnekteki Start-Job cmdlet'ini kullanmaya eşdeğerdir.
$job = Get-Process &
İş nesnelerini alma
Get-Job cmdlet'i, geçerli oturumda başlatılan arka plan işlerini temsil eden nesneleri döndürür. Get-Job, parametreler olmadan geçerli oturumda başlatılan tüm işleri döndürür.
Get-Job
İş nesnesi işin bitip bitmediğini gösteren işin durumunu içerir. Biten bir işin durumu Tamamlandı veya Başarısız'dır. Bir iş aynı zamanda Engellenmiş 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 bunu daha sonraki bir komutta işi temsil etmek için kullanabilirsiniz. Aşağıdaki komut, ID 1'e sahip işi alır ve $job değişkenine kaydeder.
$job = Get-Job -Id 1
Bir işin sonucunu almak
Bir arka plan işini çalıştırdığınızda sonuçlar hemen görünmez. Bir arka plan işinin sonuçlarını almak için Receive-Job cmdlet'ini kullanın.
Aşağıdaki örnekte, Receive-Job cmdlet'i, $job değişkenindeki iş nesnesini 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, $job değişkenindeki işin sonuçlarını $results değişkenine kaydeder.
$results = Receive-Job -Job $job
Kısmi iş sonuçlarını alma ve saklama
Receive-Job cmdlet'i bir arka plan işinin sonuçlarını alır. İş tamamlanmışsa Receive-Job tüm iş sonuçlarını alır. İş hala çalışıyorsa, Receive-Job o ana kadar oluşturulan sonuçları alır. Kalan sonuçları almak için Receive-Job komutlarını tekrar çalıştırabilirsiniz.
Varsayılan olarak Receive-Job, sonuçları iş sonuçlarının saklandığı önbellekten siler. Receive-Job'u tekrar çalıştırdığınızda 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ılan Receive-Job komutlarının sonuçlarını 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
Receive-Job'un döndürülen iş sonuçlarını silmesini önlemek için Sakla parametresini kullanın. Aşağıdaki komutlar, henüz tamamlanmayan bir işte Tut parametresini kullanmanı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ı bekliyorum
Tamamlanması uzun süren bir komut çalıştırırsanız işin ne zaman tamamlanacağını belirlemek için iş nesnesinin özelliklerini kullanabilirsiniz. Aşağıdaki komut, geçerli oturumdaki tüm arka plan işlerini almak için Get-Job nesnesini kullanır.
Get-Job
Sonuçlar bir tabloda görünür. İşin durumu Durum 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 Receive-Job cmdlet'ini kullanacak olsaydınız sonuçlar eksik olurdu. Tüm sonuçları almak için Receive-Job cmdlet'ini tekrar tekrar kullanabilirsiniz. İşin ne zaman tamamlanacağını belirlemek için Durum özelliğini kullanın.
Ayrıca Receive-Job cmdlet'inin Wait parametresini de kullanabilirsiniz. Bu parametreyi kullandığınızda, iş tamamlanana ve tüm sonuçlar mevcut olana kadar cmdlet komut istemini döndürmez.
İşin sonuçlarının herhangi birini veya tamamını beklemek için Wait-Job cmdlet'ini de kullanabilirsiniz. Wait-Job bir veya daha fazla belirli işi ya da tüm işleri beklemenizi sağlar. Aşağıdaki komut, ID 10'a sahip bir işi beklemek için Wait-Job cmdlet'ini kullanır.
Wait-Job -ID 10
Sonuç olarak, iş tamamlanana kadar PowerShell istemi bastırılır.
Ayrıca önceden belirlenmiş bir süre bekleyebilirsiniz. Bu komut, beklemeyi 120 saniyeyle sınırlamak için Zaman Aşımı 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
Bir işi durdurmak
Bir arka plan işini durdurmak için Stop-Job cmdlet'ini kullanın. Aşağıdaki komut, Sistem olay günlüğündeki her girişi almak için bir iş başlatır. İş nesnesini $job değişkenine kaydeder.
$job = Start-Job -ScriptBlock {Get-EventLog -Log System}
Aşağıdaki komut işi durdurur. $job değişkenindeki işi Stop-Job'a göndermek için bir ardışık düzen operatörü (|) kullanır.
$job | Stop-Job
Bir işi silme
Bir arka plan işini silmek için Remove-Job cmdlet'ini kullanın. Aşağıdaki komut $job değişkenindeki işi siler.
Remove-Job -Job $job
Başarısız bir işi araştırmak
İşler birçok nedenden dolayı başarısız olabilir. iş nesnesi, hatanın nedeni hakkında bilgi içeren bir Neden özelliği içerir.
Aşağıdaki örnek, gerekli kimlik bilgileri olmadan bir işi başlatıyor.
$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 Neden özelliğini inceleyin.
$job.ChildJobs[0].JobStateInfo.Reason
Bu durumda, uzak bilgisayarın komutu çalıştırmak için açık kimlik bilgileri gerektirmesi nedeniyle iş başarısız oldu. Neden özelliği aşağıdaki mesajı içerir:
Uzak sunucuya bağlanma şu hata mesajıyla başarısız oldu: "Erişim reddedildi".
Ayrıca bakınız
- about_Job_Details
- about_PSSessions
- about_Remote
- about_Remote_Jobs
- about_Thread_Jobs
- Invoke-Command
- Get-Job
- Receive-Job
- Remove-Job
- Start-Job
- Stop-Job
- Wait-Job