Aracılığıyla paylaş


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 or ThreadJob - 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:

  1. 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.
  2. İş 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 üzere Start-Jobherhangi 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-Jobiş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.