Skip Ribbon Commands
Skip to main content

Ondrej Sevecek's Blog

:

Engineering and troubleshooting by Directory Master!
Ondrej Sevecek's Blog > Posts > Asynchronní spouštění PowerShell skriptu
leden 29
Asynchronní spouštění PowerShell skriptu

Začal jsem pokusovat s asynchronním vykonáváním skriptů (příprava na Forms a GUI obecně). Není úplně dobré na to používat Start-Job, protože ten normálně spustí znovu celý PowerShell proces, což je trošku velký kalibr. Tak jsem prozatím zjistil tohle. Což je mimochodem taky cesta, jak vůbec volat PowerShell skripty z C#.

Běží to opravdu krásně asynchronně. Ještě k tomu přidám nějakou další diagnostiku a jdu do toho. Hlavně vymyslet, jak si předávat objekty za jízdy z jednoho vlákna do druhého. Což o to, vymyslet by to tak těžké nebylo, jako že to budu muset vyzkoušet. Miláček PowerShell není úplně vždy moc milý k programátorům :-)

[System.Management.Automation.PowerShell] $powershell = [powershell]::Create()

$script = @'
  param([int] $delay = 4)

  $testFile = "$env:TEMP\test.txt"
  '----' | Out-File $testFile  -Append
  (Get-Date).ToString('s') | Out-File $testFile -Append
  Start-Sleep $delay
  (Get-Date).ToString('s') | Out-File $testFile -Append
  
  return 58, (Get-Process lsass), 'text'
'@

$powershell.AddScript($script)
$powershell.AddParameter('delay', 6)
$async = $powershell.BeginInvoke()

Write-Host ('Async: {0}' -f ($async | fl * | Out-String)) -ForegroundColor Green

try {

  # Note: break manually with Ctrl-C
  #       it will go through finally{} well
  while ($true) {

    $now = [DateTime]::Now
    Write-Host ('Main: {0:s}:{1:D3} | thread completed = {2}' -f $now, $now.Millisecond, $async.IsCompleted)
    
    Start-Sleep -Milliseconds 300
  }

}

finally {

  Write-Host ('Pre-finished: {0:s}' -f (Get-Date)) -ForegroundColor Green

  # Note: this will wait until the task has really finished
  $results = $powershell.EndInvoke($async)
  $powershell.Dispose()

  Write-Host ('Finished: {0:s}' -f (Get-Date)) -ForegroundColor Green
  
  Write-Host ('Results: {0}' -f ($results -join ', '))
  Write-Host ('Result types: {0}' -f (($results | % { $_.GetType().Name }) -join ', '))
}


Dobrou.

Comments

There are no comments for this post.

Add Comment

Sorry comments are disable due to the constant load of spam *


Omlouvám se, ale příval spamu nelze kontrolovat, takže mi prosím pošlete email, pokud máte nějaký dotaz, nebo připomínku.

Title


Pole Title nemusíte vyplňovat, doplní se to samo na stejnou hodnotu jako je nadpis článku.

Author *


Pole Author nesmí být stejné jako pole Title! Mám to tu jako ochranu proti spamu. Roboti to nevyplní dobře :-)

Body *


Email


Emailová adresa, pokud na ni chcete ode mě dostat odpověď. Nikdo jiný než já vaši emailovou adresu neuvidí.

Attachments