2016-04-06 31 views
0

Get-Job ve Wait-Job ile PowwerShell'de çok iş parçacığı hakkında çok fazla okuma yaptım ancak yine de işe yaramıyor gibi görünüyor.PowerShell ile çok iş parçacıklı

Sonuç olarak, bunu çalıştırmak için GUI tabanlı bir komut dosyası olarak çalışacağım ve GUI'imin donmasını istemiyorum.

Komut, Etki Alanı Denetleyicilerinin Olay Günlüklerini arıyor ve daha sonra istediğim ayrıntıları alıp vermekteyim, ihtiyacım olan gibi çalışıyor.

Invoke-Command {#script goes here} -ComputerName ($_) -AsJob -JobName $_ kullanarak bir işe başlayabilirim ve işler çalışır. Aşağıda

Senaryo: Ben While döngü var Şu

Clear-Host 

Get-Job | Remove-Job 

(Get-ADDomainController -Filter *).Name | ForEach-Object { 

    Invoke-Command -ScriptBlock { 

     $StartTime = (Get-Date).AddDays(-4) 

     Try{ 
      Get-WinEvent -FilterHashtable @{logname='Security'; id=4740;StartTime=$StartTime} -ErrorAction Stop ` 
      | Select-Object * | ForEach-Object { 

       $Username = $_.Properties[0].Value 
       $lockedFrom = $_.Properties[1].Value 
       $DC   = $_.Properties[4].Value 
       $Time  = $_.TimeCreated 

       Write-Host "---------------------------------------------" 
       Write-Host $Username 
       Write-Host $lockedFrom 
       Write-Host $DC 
       Write-Host $Time 
       Write-Host "---------------------------------------------" 

      }#ForEach-Object 

     }catch [Exception] { 
      If ($_.Exception -match "No events were found that match the specified selection criteria") { 
       Write-Host "No events for locked out accounts." -BackgroundColor Red 
      }#If 

     }#Try Catch 

    } -ComputerName ($_) -AsJob -JobName $_ | Out-Null # Invoke-Command 

}#ForEach-Object 

onun bana sonucunu göstermek için daha sonra bekleyen söyle: my GUI

(Get-ADDomainController -Filter *).Name | ForEach-Object { 

    Write-Host "Waiting for: $_." 

     While ($(Get-Job -Name $_).State -ne 'Completed') { 
      #no doing anything here 
     }#While 

    Receive-Job -Name $_ -Keep 

}#ForEach-Object 

#clean up the jobs 
Get-Job | Remove-Job 

Düşünme (oluşturulacak), ben Her Etki Alanı Denetleyicisi için bir sütuna sahip olacak ve her bir başlığın altında sonuçlar gösterecek, GUI'mi dondurmayacak ve sonuçları geldiğinde nasıl gösterecek?

Birkaç kez sorulduğunu biliyorum, ancak örnek veremiyorum.

cevap

0

Verimlilik sağlamak için Start-Job'dan kaçınmak istiyorum.

Bu, yararlı olabilecek (PS 4.0'ım da var) ve önerilere/iyileştirmelere açık olan temel bir kurulumdur.

$MaxThreads = 2 
$ScriptBlock = { 
    Param ($ComputerName) 
    Write-Output $ComputerName 
    #your processing here... 
} 

$runspacePool = [RunspaceFactory]::CreateRunspacePool(1, $MaxThreads) 
$runspacePool.Open() 
$jobs = @() 

#queue up jobs: 
$computers = (Get-ADDomainController -Filter *).Name 
$computers | % { 
    $job = [Powershell]::Create().AddScript($ScriptBlock).AddParameter("ComputerName",$_) 
    $job.RunspacePool = $runspacePool 
    $jobs += New-Object PSObject -Property @{ 
     Computer = $_ 
     Pipe = $job 
     Result = $job.BeginInvoke() 
    } 
} 

# wait for jobs to finish: 
While ((Get-Job -State Running).Count -gt 0) { 
    Get-Job | Wait-Job -Any | Out-Null 
} 

# get output of jobs 
$jobs | % { 
    $_.Pipe.EndInvoke($_.Result) 
} 
+0

Hey teşekkürler, ben 'scriptblock' betik kopyalamıyorum ama hiçbir şey oluyor? Veriler nerede gösteriliyor? –

+0

'Write-Host' yerine 'Write-Host' yazmayı deneyin – xXhRQ8sD2L7Z

+0

Tamam, sonuçların çıktılarını almak için onu alabilirim, sadece bir gui'ye eklemek için çalışmam gerekiyor, teşekkürler yakında ekleyeceğim ve yapıştırın benim sonuçlarım :) –