使用PowerShell脚本唤醒Web服务器?

我正在构build一个执行http请求的脚本,以便“唤醒”一些asp.net应用程序。

以下脚本正在工作,但是是同步的:

function WakeUp([string] $url) { Write-Host "Waking up $url ..." -NoNewLine $client = new-object system.net.WebClient $client.UseDefaultCredentials = $true $null = $client.OpenRead($url) $client.Dispose() Write-Host " Ok" } # Run your code that needs to be elevated here @( "http://app1/", "http://app2/", "http://app3/" ) | % { WakeUp $_ } 

我想改进这个脚本,以避免目标网站被唤醒。 事实上,打电话给OpenRead在返回之前等待一个答案。

我尝试过使用OpenReadAsync ,但在调用Dispose之前发生请求实际发射和目标应用程序没有被唤醒。

我有什么select?

[编辑]应用Andy Arismendi的build议,我的脚本现在是:

 $WakeUp = { Param ([string] $url) try { Write-Output "Waking up $url ..." $client = new-object system.net.WebClient $client.UseDefaultCredentials = $true $null = $client.OpenRead($url) $client.Dispose() Write-Output "$url Ok" } catch { Write-Error $_ throw $_ } } $jobs = @() # Run your code that needs to be elevated here @( "http://app1/", "http://app2/", "http://app3/" ) | % { $jobs += Start-Job -ScriptBlock $WakeUp -ArgumentList $_ } Receive-Job -Job $jobs -Keep Wait-Job -Job $jobs 

这似乎按预期工作,但我放弃了写主机。 任何想法 ?

后台作业可以使您的工作stream程asynchronous。

  • 将唤醒function转换为脚本块:

     $WakeUp = { ([string] $url) try { # Processing... } catch { throw $_ } } 
  • 对于每个URL,将脚本块作为后台作业。

     @( "http://app1" # More... ) | % { Start-Job -ScriptBlock $WakeUp -ArgumentList $_ } 

看看我的答案,从另一个问题,看看你如何能够从后台作业接收数据,并检测哪些失败。

更新

这解决了您的版本中没有收到输出的问题。 您希望在Receive-Job Wait-Job之前使用Wait-Job来允许它们完成,因为它们是asynchronous运行的。

 $WakeUp = { param ([string] $url) try { Write-Output "Waking up $url ..." Start-Sleep -Seconds 3 if ($url -eq "http://app2/") { throw ($url + " failed") } Write-Output "$url Ok" } catch { throw $_ } } $jobs = @() # Run your code that needs to be elevated here @( "http://app1/", "http://app2/", "http://app3/" ) | % { $jobs += Start-Job -ScriptBlock $WakeUp -ArgumentList $_ } Wait-Job -Job $jobs | Out-Null Receive-Job -Job $jobs -Keep