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

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 *


Type number two as digit *


Semhle vyplňte číslici dvě. Předchozí antispemové pole nefunguje úplně dokonale, zdá se, že jsou i spamery, které pochopily, že je občas potřeba vyplnit autora :-)

Email


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

Attachments